@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)?
Спасибо.
  • Вопрос задан
  • 703 просмотра
Решения вопроса 2
tsklab
@tsklab
Здесь отвечаю на вопросы.
SQL JOIN
VQ5XP.png
Второй слева.
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
В таблице items 12 млн записей, в using_items 11 млн. Разумеется количество гипотетическое и маловероятное.

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

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

Войдите, чтобы написать ответ

Похожие вопросы