Какой оператор SQL быстрее? (ПРОТИВ против ГДЕ ...) - PullRequest
39 голосов
/ 30 ноября 2008
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

Ответы [ 6 ]

66 голосов
/ 30 ноября 2008

Теория (под теорией я имею в виду Стандарт SQL ) говорит, что WHERE ограничивает набор результатов перед возвратом строк, а HAVING ограничивает набор результатов после переноса всех строк. Так ГДЕ быстрее. В этом отношении в СУБД, соответствующих стандарту SQL, используйте HAVING только в тех случаях, когда вы не можете поставить условие в WHERE (например, в вычисляемых столбцах в некоторых СУБД.)

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

9 голосов
/ 30 ноября 2008

Это может зависеть от двигателя. MySQL, например, применяет ХАРАКТЕР почти в цепочке, что означает, что для оптимизации почти нет места. Из руководства :

Предложение HAVING применяется почти последним, непосредственно перед отправкой элементов клиенту, без оптимизации. (LIMIT применяется после HAVING.)

Я считаю, что такое поведение одинаково в большинстве механизмов баз данных SQL, но я не могу этого гарантировать.

5 голосов
/ 30 ноября 2008

Два запроса эквивалентны, и ваш оптимизатор запросов СУБД должен распознать это и произвести один и тот же план запроса. Возможно, нет, но ситуацию довольно просто распознать, поэтому я ожидаю, что любая современная система - даже Sybase - справится с ней.

Предложения HAVING следует использовать для применения условий к групповым функциям, в противном случае их можно перевести в условие WHERE. Например. скажем, если вы хотите ограничить свой запрос группами, в которых COUNT (DZIALU)> 10, вам нужно поместить условие в HAVING, поскольку оно действует на группы, а не на отдельные строки.

2 голосов
/ 03 января 2013

Сказать, что они будут оптимизировать, на самом деле не взять под контроль и не сказать компьютеру, что делать. Я бы согласился, что использование наличия не является альтернативой предложению where. Имея специальное применение для применения к группе, где использовалось что-то вроде sum (), и вы хотите ограничить результирующий набор, чтобы показывать только группы, имеющие sum ()> 100 по сути. Работать в группах, Где работает в строках. Это яблоки и апельсины. Так что, на самом деле, их не следует сравнивать, так как это два совершенно разных животных.

2 голосов
/ 30 ноября 2008

Я бы ожидал, что предложение WHERE будет быстрее, но возможно, что они оптимизируются точно так же.

0 голосов
/ 24 марта 2015

Оба оператора будут иметь одинаковую производительность, поскольку SQL Server достаточно умен, чтобы объединить оба этих оператора в один и тот же план.

Таким образом, не имеет значения, используете ли вы WHERE или HAVING в своем запросе.

Но в идеале вам следует использовать синтаксически предложение WHERE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...