Я предполагаю, что это большая таблица, иначе это не будет иметь большого значения.
В зависимости от размера таблицы и количества ключей, это может превратиться в сканирование последовательности.Если имеется много ключей IN
, Postgres часто решает не использовать индекс для него. Чем больше ключей, тем больше вероятность сканирования последовательности .
Если вы используете другой индексированный столбец в WHERE
, например:
select * from table where id in (%) and my_date > '2010-01-01';
Вероятно, будут получены все строки, соответствующие индексированным (my_date
) столбцам , а затем выполнено сканирование в памяти.
Использование JOIN
для постоянной или временной таблицы может, но не обязательно .Ему все еще нужно будет найти все строки, либо с помощью вложенного цикла (маловероятно для больших данных), либо для соединения хеш / объединение.
Я бы сказал, что решение:
- Используйте как можно меньше ключей
IN
. - Используйте другие критерии для индексации и запросов, когда это возможно.Если для
IN
требуется сканирование всех строк в памяти, по крайней мере их будет меньше благодаря дополнительным критериям.