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

我在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).

我不知所措,尽管为什么将参数更改为文字值会产生很大的不同?

最佳答案
存储过程可能正在执行参数嗅探-即,它认为您提供的值与其已经缓存的计划非常匹配,而根本不是一个很好的匹配.

关于如何解决此问题,有多篇文章,您可以测试并尝试在DEV环境中进行尝试:

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

转载注明原文:sql-server-存储过程/ CHANGETABLE函数使用参数缓慢,使用文字快速 - 代码日志