2012-01-19 24 views
3

我在SQL2008 R2中使用更改跟蹤,並看到一個非常奇怪的行爲,當試圖確定在批處理中受影響的行,存儲過程需要約30秒運行時使用參數值,但是當我將這些文字值放入調用CHANGETABLE函數時,它會返回< 1秒。存儲過程/ CHANGETABLE函數速度慢參數,與文字快速

下圖的呼叫需要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

,你能否告訴我們執行計劃? –

+0

@Igor當然 - 不確定是否有最佳格式分享它們,所以導出爲XML,並將模式名稱更改爲[刪除],因爲它標識了我們的客戶端。從[link](http://dl.dropbox.com/u/9443257/WithLiteral.sqlplan)和Variable(參數)[link](http://dl.dropbox.com)下載文字(數字) /u/9443257/WithVariable.sqlplan)。謝謝。 –

回答

4

存儲過程很可能正在執行參數嗅探 - 即它認爲您提供的值與已經緩存的計劃完全匹配,並且根本不匹配。

有關於如何解決這個問題,一個可以測試並嘗試在開發環境將是這個多篇文章:

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

+0

現貨,這正是它是什麼。我昨天下午想到了這個,但因爲我的聲譽很低,我無法回答自己的問題!如果我通過參數向語句添加了OPTION(RECOMPILE),那麼我獲得了相同的性能。多謝你們! –

相關問題