哪个SQL语句更快?(有与何处……)
或哪个SQL语句更快?(有与何处……),sql,performance,grouping,if-statement,Sql,Performance,Grouping,If Statement,或 我希望WHERE子句会更快,但它们可能会优化到完全相同的状态。理论(我的意思是理论)说WHERE在返回行之前限制结果集,而HAVE在带来所有行之后限制结果集。那么哪里更快呢。在这方面,在符合SQL标准的DBMS上,只能使用HAVING where,不能将条件放在where上(如某些RDBMS中的计算列) 您只需查看这两个方面的执行计划并亲自检查,没有什么能比得上这一点(使用数据在特定环境中测量特定查询)。这可能取决于引擎。例如,MySQL应用于几乎是最后一个,这意味着几乎没有优化的空间。从:
我希望WHERE子句会更快,但它们可能会优化到完全相同的状态。理论(我的意思是理论)说WHERE在返回行之前限制结果集,而HAVE在带来所有行之后限制结果集。那么哪里更快呢。在这方面,在符合SQL标准的DBMS上,只能使用HAVING where,不能将条件放在where上(如某些RDBMS中的计算列)
您只需查看这两个方面的执行计划并亲自检查,没有什么能比得上这一点(使用数据在特定环境中测量特定查询)。这可能取决于引擎。例如,MySQL应用于几乎是最后一个,这意味着几乎没有优化的空间。从: HAVING子句几乎是最后应用的,就在项目发送到客户机之前,没有进行优化。(限制在使用后应用。)
我相信这种行为在大多数SQL数据库引擎中都是一样的,但我不能保证。这两个查询是等效的,您的DBMS查询优化器应该识别出这一点并生成相同的查询计划。可能不会,但这种情况很容易识别,所以我希望任何现代系统——甚至Sybase——都能处理它
HAVING子句应该用于对组函数应用条件,否则可以将它们移动到WHERE条件中。例如如果您想将查询限制为COUNT(DZIALU)>10的组,例如,您需要将条件放入HAVING,因为它作用于组,而不是单个行。说它们将优化并不是真正控制并告诉计算机该做什么。我同意使用have并不能替代where条款。Having有一个特殊用法,即通过使用sum()之类的内容应用于组,您希望将结果集限制为仅显示sum()本身大于100的组。在组上工作,在行上工作。它们是苹果和桔子。因此,实际上,不应该对它们进行比较,因为它们是两种截然不同的动物。这两种语句将具有相同的性能,因为SQL Server足够聪明,可以将这两种语句解析为类似的计划 因此,在查询中使用WHERE或have并不重要 但是,理想情况下,您应该在语法上使用WHERE子句。WHERE“比HAVING”快 查询的分组越复杂-比较“HAVING”的执行速度越慢,因为“HAVING”“filter”将处理更多的结果,并且它也是额外的“filter”循环 “拥有”还将使用更多内存(RAM) 尽管在处理小数据时,差异很小,完全可以忽略。如果与大量数据相比,“拥有”的速度较慢,因为它适用于记录组,“其中”适用于行数
“Where”在带来所有行之前限制结果,“have”在带来所有行之后限制结果Heh,“这取决于引擎,但我相信它们的行为都是这样的“:-)好吧,我只能说我所知道的,并推测其余的:)在Sybase DB下,它对150行具有相同的执行时间:)我说的是执行计划,您可以看到数据库将执行哪些步骤来获取数据。150行太少,无法注意到执行时间的任何差异,但是如果计划不同,那么对于行数较多的表来说,这将很重要。在运行查询之前“将showplan设置为打开…”。。。。。。应该给你Sybase上的数据。查看此链接了解更多信息:FWIW,在MS SQL Server 2005中,执行计划是相同的。这是否取决于表和子集的大小以及整个表中where子句的成本与where子句相对于子集的成本?仅供参考,我已经编译了关于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