Какой оператор SQL работает быстрее? (HAVING против ГДЕ...)
SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
FROM PRACOWNICY
GROUP BY NR_DZIALU
HAVING NR_DZIALU = 30
или
SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
FROM PRACOWNICY
WHERE NR_DZIALU = 30
GROUP BY NR_DZIALU
Ответы
Ответ 1
Теория (по теории я имею в виду SQL Standard) говорит, что WHERE ограничивает набор результатов перед возвратом строк, а HAVING ограничивает набор результатов после приведения все строки. Итак, ГДЕ быстрее. В SQL-совместимых СУБД в этом отношении используйте только HAVING, где вы не можете поместить условие в WHERE (например, вычисленные столбцы в некоторых РСУБД).
Вы можете просто просмотреть план выполнения для обоих и проверить сами, ничто не будет бить (измерение для вашего конкретного запроса в вашей конкретной среде с вашими данными.)
Ответ 2
Это может зависеть от двигателя. Например, MySQL применяет HAVING почти последний в цепочке, то есть практически нет места для оптимизации. Из руководства :
Предложение HAVING применяется почти последним, непосредственно перед отправкой объектов клиенту без оптимизации. (LIMIT применяется после HAVING.)
Я считаю, что это поведение одинаково для большинства СУБД SQL, но я не могу этого гарантировать.
Ответ 3
Два запроса эквивалентны, и ваш оптимизатор запросов СУБД должен распознать это и создать один и тот же план запроса. Возможно, это не так, но ситуацию довольно легко распознать, поэтому я ожидаю, что любая современная система - даже Sybase - справится с ней.
HAVING-предложения должны использоваться для применения условий к групповым функциям, иначе они могут быть переведены в условие WHERE. Например. если вы хотите ограничить свой запрос группами, у которых есть COUNT (DZIALU) > 10, скажем, вам нужно будет поместить условие в HAVING, потому что оно действует на группы, а не на отдельные строки.
Ответ 4
Я бы ожидал, что предложение WHERE будет быстрее, но возможно, что они будут оптимизированы точно так же.
Ответ 5
Говорить, что они будут оптимизировать, на самом деле не контролируют и не говорят компьютеру, что делать. Я бы согласился с тем, что использование наличия не является альтернативой предложению where. Имея специальное использование, применяемое к группе, где используется что-то вроде sum(), и вы хотите ограничить набор результатов, чтобы показывать только группы, имеющие сумму() > 100, как таковую. Работает над группами, Где работает в строках. Это яблоки и апельсины. Так что действительно, их нельзя сравнивать, поскольку они являются двумя совершенно разными животными.
Ответ 6
Оба оператора будут иметь такую же производительность, что и SQL Server, достаточно умный, чтобы анализировать оба этих утверждения в аналогичном плане.
Итак, это не имеет значения, если вы используете WHERE или HAVING в своем запросе.
Но в идеале вы должны использовать предложение WHERE синтаксически.