Страницы

2 сентября 2014 г.

SQL Server. Заметки по ускорению работы БД. Запросы. EXISTS or IN ()

Если необходимо что либо сделать с данными фильтрация которых основывается на подзапросе лучше всегда использовать 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. Т.к. этому оператору не надо ничего ни с чем  сравнивать, а просто определить возвращает запрос набор данных нет - он отрабатывает в разы быстрее.