Thread: IN optimization in 7.2 ?????
hi was there optimization for IN (SELECT ... ) usage in 7.2? we just got query which runs 7 times as fast with in than with exists ! the query is like select field from table where id in (select ... where fieldx in (... IN (...))); depesz -- hubert depesz lubaczewski http://www.depesz.pl/ ------------------------------------------------------------------------ ... vows are spoken to be broken ... [enjoy the silence] ... words are meaningless and forgettable ... [depeche mode]
hubert depesz lubaczewski wrote: > hi > was there optimization for IN (SELECT ... ) usage in 7.2? > we just got query which runs 7 times as fast with in than with exists ! > the query is like select field from table where id in (select ... where > fieldx in (... IN (...))); Not that I know of. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026
On Mon, Feb 18, 2002 at 09:52:19AM -0500, Bruce Momjian wrote: > Not that I know of. strange. what could lead to this results then? i used to think that IN (SELECT ...) is the slowest possible way at all. depesz p.s. of course both select's use indices, and table is vacuumed -- hubert depesz lubaczewski http://www.depesz.pl/ ------------------------------------------------------------------------ ... vows are spoken to be broken ... [enjoy the silence] ... words are meaningless and forgettable ... [depeche mode]
hubert depesz lubaczewski wrote: > On Mon, Feb 18, 2002 at 09:52:19AM -0500, Bruce Momjian wrote: > > Not that I know of. > > strange. what could lead to this results then? > i used to think that IN (SELECT ...) is the slowest possible way at all. > > depesz > > p.s. of course both select's use indices, and table is vacuumed I have always wondered this too. Seems IN evaluates the entire query while EXISTS evaluates it for each row, or at least that is how I understand it, so saying EXISTS is always faster may be wrong. Comments? -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026
hi, reading this I remembered that I had a performance problem with "IN" too, but not with a subselect but a list of values. I had (computed) queries like: .... and xyz in (1,3,7,234......) .... with up to 20 such numbers, and found out the queries to be much faster when I wrote it this way: .... and xyz >= 1 and xyz <= 234 and xyz in (1,3,7,234......) .... where 1 is the minimum and 234 is the maximum of all values. The query plan was much much better in the latter case. Don't know if something minor is worth optimizing, but I just want let you know. Best regards, Mario Weilguni ----- Original Message ----- From: "Bruce Momjian" <pgman@candle.pha.pa.us> To: <depesz@depesz.pl> Cc: <pgsql-general@postgresql.org> Sent: Monday, February 18, 2002 3:52 PM Subject: Re: [GENERAL] IN optimization in 7.2 ????? > hubert depesz lubaczewski wrote: > > hi > > was there optimization for IN (SELECT ... ) usage in 7.2? > > we just got query which runs 7 times as fast with in than with exists ! > > the query is like select field from table where id in (select ... where > > fieldx in (... IN (...))); > > Not that I know of. > > -- > Bruce Momjian | http://candle.pha.pa.us > pgman@candle.pha.pa.us | (610) 853-3000 > + If your life is a hard drive, | 830 Blythe Avenue > + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 > > ---------------------------(end of broadcast)--------------------------- > TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org >
IIRC, the subselect is executed only once, but using IN (...) can be slow for large result sets because the searching in IN is just a sequential scan of that result set. Not sure why it'd be faster to crop of the first and last ones though.. -- Shane On Monday 18 Feb 2002 3:42 pm, Bruce Momjian wrote: > hubert depesz lubaczewski wrote: > > On Mon, Feb 18, 2002 at 09:52:19AM -0500, Bruce Momjian wrote: > > > Not that I know of. > > > > strange. what could lead to this results then? > > i used to think that IN (SELECT ...) is the slowest possible way at all. > > > > depesz > > > > p.s. of course both select's use indices, and table is vacuumed > > I have always wondered this too. Seems IN evaluates the entire query > while EXISTS evaluates it for each row, or at least that is how I > understand it, so saying EXISTS is always faster may be wrong. > Comments?