哪个 SQL 语句更快? (拥有与在哪里......)

Posted

技术标签:

【中文标题】哪个 SQL 语句更快? (拥有与在哪里......)【英文标题】:Which SQL statement is faster? (HAVING vs. WHERE...) 【发布时间】:2010-09-24 15:00:51 【问题描述】:
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

【问题讨论】:

仅供参考,我已经编译了有关有子句的优化技术,以防有人希望优化查询。 junaidtechblog.wordpress.com/2019/09/04/… 【参考方案1】:

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

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

【讨论】:

在 Sybase DB 下它对于 150 行具有相同的执行时间:) 我说的是执行计划,在这里你可以看到数据库将执行哪些步骤来获取你的数据。 150 行太少,无法注意到执行时间的任何差异,但如果计划不同,那么这对具有更多行的表很重要。在运行查询之前“设置显示计划”... ... 应该为您提供 Sybase 上的数据。查看此链接了解更多信息:groups.google.com/group/comp.databases.sybase/browse_thread/… FWIW,在 MS SQL Server 2005 中,执行计划是相同的。 这不取决于表和子集的大小以及整个表中 where 子句的成本与子集的 where 子句的成本吗?【参考方案2】:

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

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

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

【讨论】:

嘿,“这取决于引擎,但我相信它们的行为都是这样的”:-) 好吧,我只能说我知道的,其余的推测一下:)【参考方案3】:

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

HAVING 子句应该用于在组函数上应用条件,否则它们可以移动到 WHERE 条件中。例如。例如,如果您想将查询限制为 COUNT(DZIALU) > 10 的组,则需要将条件放入 HAVING 中,因为它作用于组,而不是单个行。

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

“WHERE”比“HAVING”快!

查询的更复杂的分组是 - 比较慢的“HAVING”将执行比较,因为:“HAVING”“过滤器”将处理更大量的结果,它也是额外的“过滤器”循环

“HAVING”也会使用更多内存(RAM)

尽管处理小数据时 - 差异很小,完全可以忽略

【讨论】:

【参考方案7】:

如果我们与大量数据相比,“Having”会更慢,因为它适用于记录组,而“WHERE”适用于行数..

“Where”在引入所有行之前限制结果,而“Having”在引入所有行之后限制结果

【讨论】:

【参考方案8】:

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

因此,在查询中使用 WHERE 还是 HAVING 并不重要。

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

【讨论】:

以上是关于哪个 SQL 语句更快? (拥有与在哪里......)的主要内容,如果未能解决你的问题,请参考以下文章

这两个sql查询语句哪个更快?

SQL,While循环,递归存储过程或游标中哪个更快?

java培训班哪个比较好?

c#编写的代码用:linq和传统的ado.net哪个好,出错少,哪个更快,对服务器的负担最小

哪个 RDBMS 拥有最丰富的 ANSI-SQL 超集?

哪个 SQL 查询更快,为啥?