存储过程/ CHANGETABLE函数使用参数缓慢,快速使用文字

时间:2012-01-19 13:25:18

标签: sql-server sql-server-2008 change-tracking

我正在使用SQL2008 R2中的更改跟踪并在尝试确定批处理中受影响的行时看到非常奇怪的行为,使用参数值时存储的proc需要大约30秒才能运行,但是当我放置文字值时在调用CHANGETABLE函数时,它返回< 1s。

对以下内容的调用大约需要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行会将其减少到~1s。

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

当我们运行SP1时,我认为在SQL2008 CU4中发布的用于CHANGETABLE缓慢的补丁已经修复(http://support.microsoft.com/kb/2276330)。

我不知道为什么将参数更改为字面值会产生如此大的差异?

1 个答案:

答案 0 :(得分:4)

存储过程可能正在进行参数嗅探 - 即它认为您提供的值与已经缓存的计划非常匹配,并且它根本不是一个很好的匹配。

有多篇关于如何解决这个问题的文章,你可以测试并试用DEV环境的文章是:

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