在SQL Server中,查询在SELECT子句中的变量时会显着减慢

时间:2015-07-01 13:18:24

标签: sql-server performance variables select

我有以下在SQL Server Management Studio中运行的简单代码:

DECLARE @CurDeviceIndex  int
SET @CurDeviceIndex = 314

SELECT TOP 1 
    DeviceIndex, 
    DatetimeOccurred 
FROM 
    [dvm_data].[dbo].[CalculatedData] 
WHERE 
    DeviceIndex = @CurDeviceIndex 
ORDER BY 
    ID DESC

在某些情况下,此查询需要永远运行,实际上我从未等到结束。 当我而不是变量将 DeviceIndex 直接放入查询时,它会立即执行:

SELECT TOP 1 
    DeviceIndex, 
    DatetimeOccurred 
FROM 
    [dvm_data].[dbo].[CalculatedData] 
WHERE 
    DeviceIndex = 314 
ORDER BY 
    ID DESC

似乎执行需要1)使用变量,2) DeviceIndex 是查询不返回任何内容。 当查询返回某些内容时,带变量的版本似乎也会立即生效。

当我使用硬编码的 DeviceIndex 时,无论是否有结果,查询都会立即返回。

任何想法可能导致这种奇怪的行为?!

1 个答案:

答案 0 :(得分:1)

由于您在管理工作室中使用变量,因此SQL Server在运行它时不知道它的值,并且必须针对未知值优化计划。

如果在过程中使用相同的子句,它将知道值并对其进行优化 - 但这会在第一次调用时发生,其余的执行将使用相同的计划(除非重新编译或计划被抛出缓存。)

当您直接在SQL中使用该值时,将针对该确切值优化该语句。

如果您想知道为什么需要更长的时间,您将不得不查看查询计划。很可能在其中一个计划中进行扫描,在另一个计划中进行搜索。您可以从计划中最左侧对象的属性中查看用于创建计划的参数值。