Какой оператор SQL работает быстрее?(ИМЕЯ противГДЕ...)

StackOverflow https://stackoverflow.com/questions/328636

Вопрос

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top