Если необходимо что либо сделать с данными фильтрация которых основывается на подзапросе лучше всегда использовать EXISTS нежели NOT IN ().
Реальный пример:
Запрос:
DELETE FROM document d
WHERE d.iddocument NOT IN (SELECT iddocument FROM document_relation WHERE iddocgroup = d.iddocgroup)
Отрабатывает за 24 сек.
Переписываем запрос:
DELETE FROM document d
WHERE NOT EXISTS (SELECT NULL FROM document_relation WHERE iddocgroup = d.iddocgroup)
Запрос отрабатывает за 1-2 сек.
Все дело в EXISTS. Т.к. этому оператору не надо ничего ни с чем сравнивать, а просто определить возвращает запрос набор данных нет - он отрабатывает в разы быстрее.
Комментариев нет:
Отправить комментарий