Received: from localhost (unknown [200.46.204.183]) by postgresql.org (Postfix) with ESMTP id 485F7650E79 for ; Sat, 28 Jun 2008 19:07:40 -0300 (ADT) Received: from postgresql.org ([200.46.204.86]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 21578-02 for ; Sat, 28 Jun 2008 19:07:33 -0300 (ADT) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail.gmx.net (mail.gmx.net [213.165.64.20]) by postgresql.org (Postfix) with SMTP id 949F5650E7F for ; Sat, 28 Jun 2008 19:07:36 -0300 (ADT) Received: (qmail invoked by alias); 28 Jun 2008 22:07:34 -0000 Received: from pD9E84073.dip.t-dialin.net (EHLO [192.168.2.50]) [217.232.64.115] by mail.gmx.net (mp045) with SMTP; 29 Jun 2008 00:07:34 +0200 X-Authenticated: #7655942 X-Provags-ID: V01U2FsdGVkX1/0bf5pvdj0NaPqvlEfNvZ1tgRRv1vsGEphm0cee9 frLhoZVNeYjckz Message-ID: <4866B624.1090906@gmx.net> Date: Sun, 29 Jun 2008 00:07:32 +0200 From: Ulrich User-Agent: Thunderbird 2.0.0.14 (X11/20080505) MIME-Version: 1.0 To: Tom Lane CC: pgsql-performance@postgresql.org Subject: Re: Subquery WHERE IN or WHERE EXISTS faster? References: <48665741.2060900@gmx.net> <29009.1214668423@sss.pgh.pa.us> In-Reply-To: <29009.1214668423@sss.pgh.pa.us> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Y-GMX-Trusted: 0 X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200806/207 X-Sequence-Number: 30557 Hi, I have added a bit of dummy Data, 100000 processors, 10000 users, each user got around 12 processors. I have tested both queries. First of all, I was surprised that it is that fast :) Here are the results: EXPLAIN ANALYZE SELECT speed FROM processors WHERE id IN (SELECT processorid FROM users_processors WHERE userid=4040) ORDER BY speed ASC LIMIT 10 OFFSET 1; Limit (cost=113.73..113.75 rows=7 width=5) (actual time=0.335..0.340 rows=10 loops=1) -> Sort (cost=113.73..113.75 rows=8 width=5) (actual time=0.332..0.333 rows=11 loops=1) Sort Key: processors.speed Sort Method: quicksort Memory: 17kB -> Nested Loop (cost=47.22..113.61 rows=8 width=5) (actual time=0.171..0.271 rows=13 loops=1) -> HashAggregate (cost=47.22..47.30 rows=8 width=4) (actual time=0.148..0.154 rows=13 loops=1) -> Bitmap Heap Scan on users_processors (cost=4.36..47.19 rows=12 width=4) (actual time=0.074..0.117 rows=13 loops=1) Recheck Cond: (userid = 4040) -> Bitmap Index Scan on users_processors_userid_index (cost=0.00..4.35 rows=12 width=0) (actual time=0.056..0.056 rows=13 loops=1) Index Cond: (userid = 4040) -> Index Scan using processors_pkey on processors (cost=0.00..8.28 rows=1 width=9) (actual time=0.006..0.007 rows=1 loops=13) Index Cond: (processors.id = users_processors.processorid) Total runtime: 0.471 ms (13 rows) ___________ EXPLAIN ANALYZE SELECT speed FROM processors WHERE EXISTS (SELECT 1 FROM users_processors WHERE userid=4040 AND processorid=processors.id) ORDER BY speed ASC LIMIT 10 OFFSET 1; Limit (cost=831413.86..831413.89 rows=10 width=5) (actual time=762.475..762.482 rows=10 loops=1) -> Sort (cost=831413.86..831538.86 rows=50000 width=5) (actual time=762.471..762.473 rows=11 loops=1) Sort Key: processors.speed Sort Method: quicksort Memory: 17kB -> Seq Scan on processors (cost=0.00..830299.00 rows=50000 width=5) (actual time=313.591..762.411 rows=13 loops=1) Filter: (subplan) SubPlan -> Index Scan using users_processors_pkey on users_processors (cost=0.00..8.29 rows=1 width=0) (actual time=0.006..0.006 rows=0 loops=100000) Index Cond: ((userid = 4040) AND (processorid = $0)) Total runtime: 762.579 ms (10 rows) As you can see the second query is much slower. First I thought "Just a difference of 0.3ms?", but then I realized that it was 762ms not 0.762 ;-). Both queries return the same result, so I will use #1 and count(*) takes just 0.478ms if I use query #1. Kind Regards, Ulrich Tom Lane wrote: > Ulrich writes: > >> People say that [EXISTS is faster] >> > > People who say that are not reliable authorities, at least as far as > Postgres is concerned. But it is always a bad idea to extrapolate > results on toy tables to large tables --- quite aside from measurement > noise and caching issues, the planner might pick a different plan when > faced with large tables. Load up a realistic amount of data and then > see what you get. > > regards, tom lane > >