影响SQL Server 2008 R2上的查询优化器计划的参数化

时间:2010-11-25 18:22:52

标签: sql-server-2008

参考我previous post上描述的情景:

在T-SQL脚本中,我有初始化代码:

declare @DeviceID int
declare @Partition int

set @DeviceID = 4000
set @Partition = 4000 % 250

而且,如果我尝试以下查询,我会得到分区消除:

select COUNT(*) 
from Devices
where DeviceID = @DeviceID 
and Date_Time >= '2010-02-01' and Date_Time < '2010-03-01'
and Partition = 0

但是,如果我尝试以下操作,我就不会删除分区:

select COUNT(*) 
from Devices
where DeviceID = @DeviceID 
and Date_Time >= '2010-02-01' and Date_Time < '2010-03-01'
and Partition = @Partition

如果我需要以这种方式显式设置分区值,我将如何构建存储过程?

1 个答案:

答案 0 :(得分:1)

查询计划是基于整个过程并在执行之前生成的 - 计划引擎和执行引擎本身就是不同的实体。

因此,在生成查询计划时,@ Partition的值是未知的(我们假设您分区的内容),即使您可以看到它代表一个确定性的数值,计划引擎也没有在计划查询时获得此字面值的数学。

因此,查询无法进行分区消除,因为它还不知道它正在消除哪些分区。当您使用文字数值时,它将显示消除,因为不需要预处理来将其与分区的值进行比较。