我有以下在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 时,无论是否有结果,查询都会立即返回。
任何想法可能导致这种奇怪的行为?!
答案 0 :(得分:1)
由于您在管理工作室中使用变量,因此SQL Server在运行它时不知道它的值,并且必须针对未知值优化计划。
如果在过程中使用相同的子句,它将知道值并对其进行优化 - 但这会在第一次调用时发生,其余的执行将使用相同的计划(除非重新编译或计划被抛出缓存。)
当您直接在SQL中使用该值时,将针对该确切值优化该语句。
如果您想知道为什么需要更长的时间,您将不得不查看查询计划。很可能在其中一个计划中进行扫描,在另一个计划中进行搜索。您可以从计划中最左侧对象的属性中查看用于创建计划的参数值。