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

Jam*_*art 11 sql-server t-sql

大家早,

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

我添加了一个选择以从子查询中的表中获取顶部记录(如果这是有道理的)

查询用了将近 3 分钟才返回一个包含 100 条记录的最终结果集

SELECT TOP 1 ...
Run Code Online (Sandbox Code Playgroud)

我在网上查看了我试图实现的改进,有人建议我更改我的选择以使用变量,如下所示

DECLARE @topCount INT
SET @topCount = 1

SELECT TOP (@topCount) ...
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*son 14

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

当您使用局部变量时,优化器不知道该变量的值,而是构建一个经过优化以尽可能快地获取 100 行的计划。

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

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