Received: from localhost (maia-4.hub.org [200.46.204.183]) by postgresql.org (Postfix) with ESMTP id 91C4E9FB276 for ; Sat, 14 Apr 2007 19:03:00 -0300 (ADT) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 34515-09 for ; Sat, 14 Apr 2007 19:02:57 -0300 (ADT) X-Greylist: from auto-whitelisted by SQLgrey-1.7.4 Received: from sss.pgh.pa.us (sss.pgh.pa.us [66.207.139.130]) by postgresql.org (Postfix) with ESMTP id 24FC19FB26E for ; Sat, 14 Apr 2007 19:02:56 -0300 (ADT) Received: from sss2.sss.pgh.pa.us (tgl@localhost [127.0.0.1]) by sss.pgh.pa.us (8.13.6/8.13.6) with ESMTP id l3EM2rI3023415; Sat, 14 Apr 2007 18:02:53 -0400 (EDT) To: pgsql-patches@postgreSQL.org cc: Alvaro Herrera , Steve Subject: Re: [HACKERS] choose_bitmap_and again (was Re: [PERFORM] Strangely Variable Query Performance) In-reply-to: <7772.1176574886@sss.pgh.pa.us> References: <10117.1176420763@sss.pgh.pa.us> <10355.1176422445@sss.pgh.pa.us> <10503.1176423606@sss.pgh.pa.us> <12360.1176436194@sss.pgh.pa.us> <26399.1176504501@sss.pgh.pa.us> <20070413232409.GI27255@alvh.no-ip.org> <7772.1176574886@sss.pgh.pa.us> Comments: In-reply-to Tom Lane message dated "Sat, 14 Apr 2007 14:21:26 -0400" MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0" Content-ID: <23403.1176588122.0@sss.pgh.pa.us> Date: Sat, 14 Apr 2007 18:02:53 -0400 Message-ID: <23414.1176588173@sss.pgh.pa.us> From: Tom Lane X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200704/375 X-Sequence-Number: 1942 ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset="us-ascii" Content-ID: <23403.1176588122.1@sss.pgh.pa.us> I wrote: > Thinking more about this leads me to the following proposal: > 1. Explicitly group the indexes according to the subset of > WHERE-conditions (and partial index conditions, if any) they use. > Within each such group, discard all but the cheapest-scan-cost one. > 2. Sort the remaining indexes according to scan cost. > 3. For each index in order, consider it as a standalone scan, and also > consider adding it on to the AND-group led by each preceding index, > using the same logic as now: reject using any WHERE-condition twice > in a group, and then add on only if the total cost of the AND-group > scan is reduced. Here is a patch along these lines, in fact two patches (HEAD and 8.2 versions). The 8.2 version picks up some additional partial-index intelligence that I added to HEAD on Mar 21 but did not at that time risk back-patching --- since this is a fairly large rewrite of the routine, keeping the branches in sync seems best. Steve, can you try this out on your queries and see if it makes better or worse decisions? It seems to fix your initial complaint but I do not have a large stock of test cases to try. regards, tom lane ------- =_aaaaaaaaaa0 Content-Type: application/octet-stream Content-ID: <23403.1176588122.2@sss.pgh.pa.us> Content-Description: choose-bitmap-and-head.patch.gz Content-Transfer-Encoding: base64 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 /lgAAA== ------- =_aaaaaaaaaa0 Content-Type: application/octet-stream Content-ID: <23403.1176588122.3@sss.pgh.pa.us> Content-Description: choose-bitmap-and-82.patch.gz Content-Transfer-Encoding: base64 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 ------- =_aaaaaaaaaa0--