2015-03-11 3 views
2

Я хотел бы решить, какой запрос будет быстрее. Я думаю, что СОЕДИНЯЮТСЯ сначала, а затем ГДЕ.Производительность запроса - INNER Присоединиться к фильтрации

Итак, это звучит так:

SELECT * 
FROM Table1 t1 
INNER JOIN Table2 t2 
    ON t1.field = t2.field 
    AND t2.Deleted = 0 
INNER JOIN Table2 t3 
    ON t2.field = t3.field 
    AND t3.Deleted = 0 
WHERE t1.Deleted = 0 

бы быть быстрее:

SELECT * 
FROM Table1 t1 
INNER JOIN Table2 t2 
    ON t1.field = t2.field 
INNER JOIN Table2 t3 
    ON t2.field = t3.field 
WHERE 
    t1.Deleted = 0 AND 
    t2.Deleted = 0 AND 
    t3.Deleted = 0 

стыки в первом запросе будет отфильтровать данные ранее, и, следовательно, меньше присоединения.

(я понимаю thi8s может быть иначе, если у вас есть ЛЕВЫЙ соединения)

+1

Посмотрите на планы запросов. Они должны быть одинаковыми. У SQL Server есть хороший оптимизатор запросов, и он определяет лучший способ выполнения объединений и фильтрации в запросе. –

+1

Логически говоря, да, 'JOIN' обрабатывается до' WHERE', но физически говоря, механизм базы данных может выполнять запрос, однако он считает нужным, при условии, что он дает тот же результат. Таким образом, как предлагает @GordonLinoff, планы выполнения могут быть похожими или идентичными. – Brandon

+0

В дополнение к другим комментариям: SQL указывает «что» не «как». – zerkms

ответ

2

Обратите внимание, что условие WHERE вы предоставляете в форме под названием Conjunctive Normal Form. Всякий раз, когда ваш запрос имеет простые условия сравнения или равенства, объединенные в Conjunctive Normal Form, оптимизатор будет полностью небрежен, если он не выполнит преобразование из вашего стиля 2 в ваш стиль 1. Я считаю, что можно с уверенностью предположить, что оптимизаторы для ВСЕГО зрелого SQL продукты вполне способны эффективно оптимизировать простые предикаты либо в дизъюнктивной, либо в конъюнктивной нормальной форме.

Однако в определенный момент оптимизатор должен прекратить анализ запроса и начать построение оптимизированного запроса. В тех случаях, когда условия вашего фильтра являются сложными, может быть полезно помочь оптимизатору, найдя предложения в правильном подзапросе.

Однако этот шаг обычно не выполняется, если запрос фактически не проверяется как недействующий. Человеческий труд намного дороже, чем циклы ЦП, и это включает время, затрачиваемое людьми на чтение кода как часть обзора кода и обслуживания. До тех пор, пока запрос не будет доказан неэффективным с точки зрения необходимости ручной настройки, лучше сохранить условия фильтрации в предложении WHERE, где они могут быть легко идентифицированы и проверены.