Функция хранимой процедуры / CHANGETABLE медленная с параметрами, быстрая с литералом - PullRequest
3 голосов
/ 19 января 2012

Я использую отслеживание изменений в SQL2008 R2 и вижу очень странное поведение при попытке определить строки, затронутые в пакете, сохраненный процесс занимает ~ 30 секунд для запуска при использовании значения параметра, но когда я помещаю литеральные значенияв вызове функции CHANGETABLE она возвращается через <1 с. </p>

Вызов следующего занимает ~ 30 с:

DECLARE  @sync_last_received_anchor BigInt;
DECLARE  @sync_new_received_anchor BigInt;

SET @sync_last_received_anchor = 272361;
SET @sync_new_received_anchor = 273361;

SELECT [Customer].[CustomerID]
FROM dbo.tblCustomer AS [Customer] WITH (NOLOCK) 
    INNER JOIN CHANGETABLE(CHANGES [REDACTED].[dbo].[tblCustomer], @sync_last_received_anchor) AS [theChangeTable] 
    ON [theChangeTable].[CustomerID] = [Customer].[CustomerID]
WHERE ([theChangeTable].[SYS_CHANGE_OPERATION] = 'U' 
    AND [theChangeTable].[SYS_CHANGE_VERSION] <= @sync_new_received_anchor
)

Однако изменение строки CHANGETABLE, как показано ниже, уменьшает ее до ~1с.

    INNER JOIN CHANGETABLE(CHANGES [REDACTED].[dbo].[tblCustomer], 272361) AS [theChangeTable] 

Поскольку мы запускаем SP1, я предполагаю, что исправление, выпущенное в SQL2008 CU4 для медленного изменения CHANGETABLE, было исправлено (http://support.microsoft.com/kb/2276330).

, хотя я в замешательстве, почему меняю параметрли буквальное значение будет иметь такое большое значение?

1 Ответ

4 голосов
/ 20 января 2012

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

Существует несколько статей о том, как подойти к этой проблеме, одну из которых вы можете протестировать и попробовать в среде DEV, так это:

http://blogs.msdn.com/b/axperf/archive/2010/05/07/important-sql-server-change-parameter-sniffing-and-plan-caching.aspx

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