TSQL为什么使用变量可以使Top更快?


10

大家早,

我一直在研究一些中度复杂的sql,以从第三方产品数据库中“获取”某些数据,以将其显示在我们自己的内部应用程序中。

我添加了一个select来从子查询中的表中获取最高记录(如果那很有意义)

该查询花费了将近3分钟的时间,使用以下命令返回了100条记录的最终结果集

SELECT TOP 1 ...

我在网上查看了要实现的目标的改进,建议我将选择更改为使用变量,如下所示

DECLARE @topCount INT
SET @topCount = 1

SELECT TOP (@topCount) ...

这将相同的查询从3分钟缩短到1秒,这太好了!

但是谁能解释为什么会这样。

Answers:


14

执行top 1此操作时,查询优化器将构建一个计划,该计划旨在尽快获取1行。

当您使用局部变量时,变量的值对于优化器是未知的,而是构建一个优化后的计划,以尽可能快地获取100行。

在您的情况下,即使您只希望一行,以行目标100生成的查询计划也是更好的计划。

要进行验证,您可以尝试option (recompile)使用变量将其添加到查询中。在这种情况下,SQL Server将使用当前值@topCount作为行目标,并且由于该值为1,因此您应该获得慢速计划。


我了解计划的差异,但令我惊讶的是,获取1行可能比获取100行慢。我认为,如果100行计划最有效,则SQL Server将对使用相同的计划top 1
布兰登

@Brandon它不会获取100行,而仅在需要100行的前提下构建执行计划。找到1行后,执行终止。
Mikael Eriksson 2014年

检查什么在这些情况下,执行计划的不同可能会有助于理解这个问题是与顶级1.什么
詹姆斯ž
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.