Подтвердить что ты не робот

Какой оператор 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
4b9b3361

Ответ 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 синтаксически.