Какой оператор SQL работает быстрее?(ИМЕЯ противГДЕ...)
-
11-07-2019 - |
Вопрос
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
Решение
Теория (под теорией я подразумеваю Стандарт SQL) говорит, что WHERE ограничивает результирующий набор перед возвратом строк и HAVING ограничивает результирующий набор после приведения всех строк.Итак, ГДЕ же быстрее.В СУБД, совместимых со стандартом SQL, в этом отношении используйте только HAVING where, вы не можете поставить условие для WHERE (например, вычисляемые столбцы в некоторых СУБД).)
Вы можете просто просмотреть план выполнения для обоих и проверить сами, ничто не сравнится с этим (измерение для вашего конкретного запроса в вашей конкретной среде с вашими данными).)
Другие советы
Это может зависеть от двигателя.MySQL, например, применяется почти последним в цепочке, что означает, что почти нет места для оптимизации.Из руководство пользователя:
Предложение HAVING применяется почти в последнюю очередь, непосредственно перед отправкой элементов клиенту, без оптимизации.(ОГРАНИЧЕНИЕ применяется после ПОЛУЧЕНИЯ.)
Я полагаю, что такое поведение одинаково в большинстве движков баз данных SQL, но я не могу этого гарантировать.
Эти два запроса эквивалентны, и ваш оптимизатор запросов СУБД следует распознайте это и создайте тот же план запроса.Возможно, это и не так, но ситуацию довольно просто распознать, поэтому я ожидаю, что любая современная система - даже Sybase - справится с этим.
Предложения HAVING следует использовать для применения условий к групповым функциям, в противном случае они могут быть преобразованы в условие WHERE.Например.если бы вы хотели ограничить свой запрос группами, у которых количество (DZIALU), скажем, > 10, вам нужно было бы поместить условие в HAVING, потому что оно действует на группы, а не на отдельные строки.
Я бы ожидал, что предложение WHERE будет быстрее, но, возможно, они будут оптимизированы точно так же.
Говорить, что они будут оптимизировать, на самом деле не означает брать управление в свои руки и указывать компьютеру, что делать.Я бы согласился с тем, что использование having не является альтернативой предложению where .Having имеет особое значение для применения к группе, где использовалось что-то вроде sum(), и вы хотите ограничить результирующий набор отображением только групп, имеющих sum() > 100 как таковых.Наличие работает с группами, Где работает со строками.Это яблоки и апельсины.Так что на самом деле их не следует сравнивать, поскольку это два очень разных животного.
Оба оператора будут иметь одинаковую производительность, поскольку SQL Server достаточно умен, чтобы преобразовать оба одинаковых оператора в аналогичный план.
Таким образом, не имеет значения, используете ли вы WHERE или HAVING в своем запросе.
Но в идеале вы должны синтаксически использовать предложение WHERE.