我在 SQL2008 R2 中使用更改跟踪并在尝试确定批处理中受影响的行时看到一个非常奇怪的行为,使用参数值时,存储过程需要大约 30 秒才能运行,但是当我将文字值放入调用中时到 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 行,如下所示,将其减少到 ~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 函数用参数慢,用文字快,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8926770/

10-13 02:40