K.I.S.S. here ..... the best way to do one of these in most DB's is
typically an outer join and test for null:

select f1.* from friends f1
   left outer join friends f2 on (f1.user_id=f2.ref_id and
f1.ref_id=f2.user_id)
   where f2.id is null;

On Fri, Mar 19, 2010 at 7:26 AM, Corin <wakath...@gmail.com> wrote:

> Hi all!
>
> While evaluting the pgsql query planer I found some weird behavior of the
> query planer. I think it's plan is way too complex and could much faster?
>
> CREATE TABLE friends (
>   id integer NOT NULL,
>   user_id integer NOT NULL,
>   ref_id integer NOT NULL,
> );
>
> ALTER TABLE ONLY friends ADD CONSTRAINT friends_pkey PRIMARY KEY (id);
> CREATE INDEX user_ref ON friends USING btree (user_id, ref_id);
>
> I fill this table with around 2.800.000 random rows (values between 1 and
> 500.000 for user_id, ref_id).
>
> The intention of the query is to find rows with no "partner" row. The
> offset and limit are just to ignore the time needed to send the result to
> the client.
>
> SELECT * FROM friends AS f1 WHERE NOT EXISTS (SELECT 1 FROM friends AS f2
> WHERE f1.user_id=f2.ref_id AND f1.ref_id=f2.user_id) OFFSET 1000000 LIMIT 1
>
> <snip>

Reply via email to