哪个SQL语句更快? (HAVING vs. WHERE ......)

时间:2008-11-30 08:39:45

标签: sql performance grouping if-statement

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

8 个答案:

答案 0 :(得分:66)

理论(理论上我的意思是SQL Standard)说WHERE在返回行之前限制结果集,HAVING在带来所有行之后限制结果集。所以WHERE更快。在这方面符合SQL标准的DBMS,只使用HAVING,你不能把条件放在WHERE上(比如某些RDBMS中的计算列。)

你可以看到两者的执行计划并自行检查,没有什么能比这更好(用您的数据测量特定环境中的特定查询。)

答案 1 :(得分:9)

可能取决于引擎。例如,MySQL在链中应用HAVING几乎是最后一个,这意味着几乎没有优化空间。来自manual

  

HAVING子句几乎在最后一次应用,就在项目发送到客户端之前,没有优化。 (在HAVING之后应用LIMIT。)

我相信这种行为在大多数SQL数据库引擎中是相同的,但我无法保证。

答案 2 :(得分:5)

这两个查询是等效的,您的DBMS查询优化器应该识别这个并生成相同的查询计划。它可能没有,但情况相当容易识别,所以我希望任何现代系统 - 甚至是Sybase - 来处理它。

HAVING子句应该用于对组函数应用条件,否则它们可以被转换为WHERE条件。例如。如果您想将查询限制为具有COUNT(DZIALU)>的群组10,比方说,你需要将条件置于HAVING中,因为它作用于组,而不是单个行。

答案 3 :(得分:2)

我希望WHERE子句更快,但它们可能会优化到完全相同。

答案 4 :(得分:2)

说他们会优化并不是真正控制并告诉计算机该做什么。我同意使用having不能替代where子句。具有应用于组的特殊用法,其中使用了诸如sum()之类的东西,并且您希望将结果集限制为仅显示具有sum()>的组。超过100本身。在组上工作,在行上工作。它们是苹果和橘子。所以真的,他们不应该被比较,因为他们是两个非常不同的动物。

答案 5 :(得分:1)

“ WHERE”比“ HAVING”快!

查询的分组更为复杂-比较“ HAVING”的执行速度较慢,因为:“ HAVING”“ filter”将处理大量结果,并且还会产生附加的“ filter”循环

“ HAVING”还将使用更多的内存(RAM)

在处理小数据时也是如此-差异很小,可以完全忽略

答案 6 :(得分:1)

如果我们与大量数据进行比较,则“具有”会更慢,因为它适用于记录组,而“ WHERE”适用于行数。.

“在哪里”会限制所有行之前的结果,而“正在”会限制所有行之后的结果

答案 7 :(得分:0)

两个语句都具有相同的性能,因为SQL Server足够聪明,可以将相同的语句解析为类似的计划。

因此,如果在查询中使用WHERE或HAVING,则无关紧要。

但是,理想情况下,你应该在语法上使用WHERE子句。