Параметризация, влияющая на план оптимизатора запросов в SQL Server 2008 R2 - PullRequest
0 голосов
/ 25 ноября 2010

Ссылаясь на сценарий, описанный в моем предыдущем посте :

В скрипте 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 Ответ

1 голос
/ 26 ноября 2010

План запроса генерируется на основе всей процедуры и перед любым выполнением - механизм планирования и механизм выполнения являются различными сущностями как таковыми.

Таким образом, в момент создания плана запроса,значение @Partition неизвестно (и мы предполагаем, на что вы разбили), даже если вы видите, что оно представляет собой детерминированное числовое значение, механизм планирования не выполняет математические вычисления для получения этого литерального значения во время планирования запроса.

В результате запрос не может удалить разделение, поскольку он еще не знает, какие разделы он удаляет.Когда вы используете буквенное числовое значение, оно будет показывать исключение, потому что не требуется никакой предварительной обработки для сравнения со значениями для разделения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...