症状
假设你已在你的计算机上应用 Microsoft SQL Server 2012 Service Pack 2 (SP2)。 在sp_executesql存储过程中调用cdc.fn_cdc_get_net_changes_<Capture_instance>更改数据捕获(cdc)查询,它可能来自应用程序源,如 SQL server Management STUDIO 服务器(SSMS)、Cdc 自身或 sql Server Integration Services (SSIS)程序包。 在这种情况下,SQL Server 2012 中的性能很差。注意性能下降可能很大。 例如,在 SQL Server 2012 SP1 中,查询可以在几秒钟内完成。 但是,相同的查询可能需要几个小时才能在 SQL Server 2012 SP2 中运行。 此外,统计信息更新不能帮助解决此问题。
原因
出现此问题的原因在于基数估计中严重影响 cdc.fn_cdc_get_net_changes_<capture_instance>查询的性能的问题。
解决方案
在 SQL Server 的以下累积更新中,此问题首先已修复。
SQL Server 2012 SP2 的累积更新3 /en-us/help/3002049
SQL Server 的每个新的累积更新均包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 查看 SQL Server 的最新累积更新:
解决方法
若要解决此问题,请在查询中使用 选项(重新编译) 查询提示。 如果查询是从 SSIS CDC 组件触发的,则可以通过创建计划指南来强制执行 选项(重新编译) 提示,如下例所示:Exec sp_create_plan_guide @name = N'CDC_Query1_PlanGuide', @stmt = N'select [__$start_lsn],[__$operation],[__$update_mask],[Column1],[Column2],[Column3] from [cdc].[fn_cdc_get_net_changes_dbo_Table1](CONVERT(binary(10), @cs, 1), CONVERT(binary(10), @ce, 1), @mode)',@type = N'SQL',@module_or_batch = NULL, @params = N'@ce nvarchar(22),@mode nvarchar(14),@cs nvarchar(22)', @hints = N'OPTION (RECOMPILE)'; 注意您必须将示例查询替换为您遇到问题的查询。 它可以从 探查器 跟踪中抓取,因此不会意外添加任何额外字符。 此外,请确保选择 查询放置在单行中(例如,不应包含任何回车符或换行符),以便计划指南能够成功工作。 你可能还必须使用 DBCC FREEPROCCACHE 从缓存中挖空旧计划。
状态
Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。