Задать вопрос
@tukreb

Насколько дорогая SQL операция NOT IN/NOT EXISTS?

Меня интересует вопрос, на сколько будут дорогие SQL запросы с NOT IN или NOT EXISTS?
Допустим есть 2 таблицы
items и using_items
В таблице items 12 млн записей, в using_items 11 млн. Разумеется количество гипотетическое и маловероятное.

SELECT t.id, t.name 
FROM items t
WHERE (t.type = 'some_item_type') AND t.id
      NOT IN (
          SELECT w.id_item
          FROM using_items w
         )
ORDER BY t.name ASC;


или

SELECT t.id, t.name 
FROM items t
WHERE (t.type = 'some_item_type') AND 
      NOT EXISTS (
          SELECT w.id_item
          FROM using_items w
          WHERE t.id = w.id_item
         )
ORDER BY t.name ASC;


На сколько всё будет плохо в каждом из запросов? Если очень плохо, какие есть варианты решения?
Или придётся дробить таблицу using_items на таблицы по атрибуту type (using_items_type1, using_items_type2)?
Спасибо.
  • Вопрос задан
  • 761 просмотр
Подписаться 1 Простой Комментировать
Решение пользователя Melkij К ответам на вопрос (2)
Melkij
@Melkij
DBA Team для вашего PostgreSQL?
В таблице items 12 млн записей, в using_items 11 млн. Разумеется количество гипотетическое и маловероятное.

Да нагенерируйте и посмотрите explain analyze. Были бы действительно объёмы, а не всего-то десяток миллионов строк.

not in дорог из-за требования стандарта по части обработки NULL в not in и отсутствии специальных оптимизаций для этого случая. Может быть оптимизация появится.
not exists оптимален.
через left join план может быть идентичным not exists
Ответ написан
Комментировать