参考我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
如果我需要以这种方式显式设置分区值,我将如何构建存储过程?
答案 0 :(得分:1)
查询计划是基于整个过程并在执行之前生成的 - 计划引擎和执行引擎本身就是不同的实体。
因此,在生成查询计划时,@ Partition的值是未知的(我们假设您分区的内容),即使您可以看到它代表一个确定性的数值,计划引擎也没有在计划查询时获得此字面值的数学。
因此,查询无法进行分区消除,因为它还不知道它正在消除哪些分区。当您使用文字数值时,它将显示消除,因为不需要预处理来将其与分区的值进行比较。