Received: from candle.pha.pa.us (root@s5-03.ppp.op.net [209.152.195.67]) by hub.org (8.8.8/8.7.5) with ESMTP id UAA00777; Wed, 15 Jul 1998 20:00:58 -0400 (EDT) Received: (from maillist@localhost) by candle.pha.pa.us (8.8.5/8.8.5) id TAA07145; Wed, 15 Jul 1998 19:39:05 -0400 (EDT) From: Bruce Momjian Message-Id: <199807152339.TAA07145@candle.pha.pa.us> Subject: Re: [INTERFACES] Re: [HACKERS] changes in 6.4 In-Reply-To: <35AD2A22.A5C2D5A1@insightdist.com> from David Hartwig at "Jul 15, 1998 6:16: 2 pm" To: daveh@insightdist.com (David Hartwig) Date: Wed, 15 Jul 1998 19:39:05 -0400 (EDT) Cc: hannu@trust.ee, pgsql-interfaces@postgreSQL.org, hackers@postgreSQL.org X-Mailer: ELM [version 2.4ME+ PL43 (25)] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit > The results are profound. Queries that used to scan tables because of the > ORs, now make use of any indexes. Thus, the size of the table has virtually > no effect on performance. Furthermore, queries that used to crash the > backend, now run in under a second. > > Currently the down sides are: > 1. If there is no usable index, performance is significantly worse. The > patch does not check to make sure that there is a usable index. I could use > some pointers on this. > > 2. Small tables are actually a bit slower than without the patch. > > 3. Not very elegant. I am looking for a more generalized solution. > I have lots of ideas, but I would need to know the backend much better before > attempting any of them. My favorite idea is before cnfify(), to factor the > OR terms and pull out the constants into a virtual (temporary) table spaces. > Then rewrite the query as a join. The optimizer will (should) treat the new > query accordingly. This assumes that an efficient factoring algorithm exists > and that temporary tables can exist in the heap. OK, I have an idea. Just today, we allow: select * from tab1 where val in ( select x from tab2 union select y from tab3 ) How about if instead of doing: select * from tab1 where val = 3 union select * from tab1 where val = 4 ... you change it to: select * from tab1 where val in ( select 3 union select 4 ) This may be a big win. You aren't running the same query over and over again, with the same joins, and just a different constant. Let me know. If it fails for some reason, it is possible my subselect union code has a bug, so let me know. -- Bruce Momjian | 830 Blythe Avenue maillist@candle.pha.pa.us | Drexel Hill, Pennsylvania 19026 + If your life is a hard drive, | (610) 353-9879(w) + Christ can be your backup. | (610) 853-3000(h)