Re: optimizing select ... not in (select ...)

Поиск
Список
Период
Сортировка
От Josh Berkus
Тема Re: optimizing select ... not in (select ...)
Дата
Msg-id web-101179@davinci.ethosmedia.com
обсуждение исходный текст
Ответ на optimizing select ... not in (select ...)  (Laurent Martelli <laurent@aopsys.com>)
Список pgsql-sql
Laurent,

> select distinct on (Pictures.PictureID) * from Pictures where
> Pictures.PictureID not in (select distinct PictureID from Keywords);
>
> and I find it a bit slow. Does anybody have suggestions to run this
> faster ? (I have indexes on PictureID on both Pictures and Keywords)

NOT IN is always slow on all RDBMS that I know, unless the subselect has
a very small (<100) return set.  This is because the engine has to
compare each row in the master query against every value returned by NOT
IN, one row at a time.

Try the WHERE NOT EXISTS construction instead:
SELECT * FROM Pictures
WHERE NOT EXISTS ( SELECT pictureID FROM keywords
           WHERE keywords.pictureID = Pictures.pictureID );

This uses the DB engine's JOIN functionality and thus runs considerably
faster.

BTW, all those "DISTINCT" in the query example you gave, assuming that
PictureID is the unique index of Pictures, are completely superfluous
and will only slow the query down.  Particularly the use of DISTINCT in
a subquery should only be used if the contents of the subquery will be
displayed as part of the result set.

-Josh Berkus





______AGLIO DATABASE SOLUTIONS___________________________
                                       Josh Berkus
  Complete information technology      josh@agliodbs.com
   and data management solutions       (415) 565-7293
  for law firms, small businesses        fax 621-2533
    and non-profit organizations.      San Francisco

Вложения

В списке pgsql-sql по дате отправления:

Предыдущее
От: alangutierrez@hotmail.com (agutier)
Дата:
Сообщение: Re: REFERENCES constraint
Следующее
От: Tomas Berndtsson
Дата:
Сообщение: Re: optimizing select ... not in (select ...)