Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哪个SQL语句更快?(有与何处……)_Sql_Performance_Grouping_If Statement - Fatal编程技术网

哪个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