X-Original-To: pgsql-hackers-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [64.117.224.130]) by svr1.postgresql.org (Postfix) with ESMTP id 68E32D1BB7F for ; Thu, 21 Aug 2003 17:42:57 -0300 (ADT) Received: from svr1.postgresql.org ([64.117.224.193]) by localhost (neptune.hub.org [64.117.224.130]) (amavisd-new, port 10024) with ESMTP id 43775-03 for ; Thu, 21 Aug 2003 17:42:28 -0300 (ADT) Received: from sss.pgh.pa.us (unknown [192.204.191.242]) by svr1.postgresql.org (Postfix) with ESMTP id B23F8D1BB8D for ; Thu, 21 Aug 2003 17:42:25 -0300 (ADT) Received: from sss2.sss.pgh.pa.us (tgl@localhost [127.0.0.1]) by sss.pgh.pa.us (8.12.9/8.12.9) with ESMTP id h7LKgL5H025063; Thu, 21 Aug 2003 16:42:21 -0400 (EDT) To: Stephan Szabo Cc: Dani Oderbolz , pgsql-hackers@postgreSQL.org Subject: Re: [SQL] "SELECT IN" Still Broken in 7.4b In-reply-to: <20030821102627.C51705-100000@megazone.bigpanda.com> References: <20030821102627.C51705-100000@megazone.bigpanda.com> Comments: In-reply-to Stephan Szabo message dated "Thu, 21 Aug 2003 10:28:53 -0700" Date: Thu, 21 Aug 2003 16:42:20 -0400 Message-ID: <25062.1061498540@sss.pgh.pa.us> From: Tom Lane X-Virus-Scanned: by amavisd-new at postgresql.org X-Archive-Number: 200308/964 X-Sequence-Number: 42621 Stephan Szabo writes: > Within the scope of the new hashed IN stuff I believe so in at least some > cases. I have a few million row table of integers where searching for > values IN (~10000 values) takes longer than creating the temp table, > copying into it and doing the in subquery. I did some profiling and soon realized that the main problem is the executor's trick for not returning the same row multiple times in a multiple-indexscan plan node. The point is that given WHERE a = 1 OR b = 1 you could create a plan that first indexscans on a, then indexscans on b --- but you mustn't return any tuples in the second scan that you already returned in the first. IndexNext solves this by evaluating the prior-scan index conditions to see if they are true. Which is okay if there aren't too many of them. But when you have an N-element IN list this means you are going to do O(N^2) index expression evaluations. In the 10000-element IN-list test case, ExecQual gets called almost 50 million times :-( I'm toying with the notion of ripping out that logic and instead building an in-memory hashtable of already-returned TIDs. This could theoretically run out of memory if the multiple indexscan returns enough tuples, but I think in practice that wouldn't happen because the planner wouldn't choose an indexscan when very large numbers of tuples are being selected. Comments? regards, tom lane