Оператор PostgreSQL IN () все еще быстр с 1000 аргументами? - PullRequest
3 голосов
/ 03 августа 2010

Я запрашиваю вернуть все строки из таблицы, кроме тех, которые находятся в некотором списке значений, который является постоянным во время запроса. Например. SELECT * FROM table WHERE id IN (%) и% гарантированно являются списком значений, а не подзапросом. Однако в некоторых случаях этот список значений может содержать до 1000 элементов. Должен ли я ограничить это меньшим подсписком (всего 50-100 элементов настолько малы, насколько я могу в этом случае), или будет незначительное увеличение производительности?

Ответы [ 2 ]

4 голосов
/ 04 августа 2010

Я предполагаю, что это большая таблица, иначе это не будет иметь большого значения.

В зависимости от размера таблицы и количества ключей, это может превратиться в сканирование последовательности.Если имеется много ключей IN, Postgres часто решает не использовать индекс для него. Чем больше ключей, тем больше вероятность сканирования последовательности .

Если вы используете другой индексированный столбец в WHERE, например:

select * from table where id in (%) and my_date > '2010-01-01';

Вероятно, будут получены все строки, соответствующие индексированным (my_date) столбцам , а затем выполнено сканирование в памяти.

Использование JOIN для постоянной или временной таблицы может, но не обязательно .Ему все еще нужно будет найти все строки, либо с помощью вложенного цикла (маловероятно для больших данных), либо для соединения хеш / объединение.

Я бы сказал, что решение:

  • Используйте как можно меньше ключей IN.
  • Используйте другие критерии для индексации и запросов, когда это возможно.Если для IN требуется сканирование всех строк в памяти, по крайней мере их будет меньше благодаря дополнительным критериям.
2 голосов
/ 03 августа 2010

Используйте временную таблицу для JOIN, дает лучшую производительность и не имеет ограничений.IN () с 1000 аргументами вызовет проблемы в любой базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...