我读过启用变更数据捕获显然会对数据库性能产生影响。这种性能损失会仅影响启用了 CDC 的表,还是会影响整个数据库的所有操作
在我的情况下,我使用的是 SSIS,并且有大量数据进出暂存数据库。我在系统中还有一些用于转换的查找表。我希望使用 CDC 作为仅审核对这些参考表的更改(而不是导入的数据)的一种手段。我作为 ETL 的一部分运行的主要查询访问这些引用表,但不更改它们,所以我试图弄清楚是否仍然会有明显的性能影响?
谢谢
我读过启用变更数据捕获显然会对数据库性能产生影响。这种性能损失会仅影响启用了 CDC 的表,还是会影响整个数据库的所有操作
在我的情况下,我使用的是 SSIS,并且有大量数据进出暂存数据库。我在系统中还有一些用于转换的查找表。我希望使用 CDC 作为仅审核对这些参考表的更改(而不是导入的数据)的一种手段。我作为 ETL 的一部分运行的主要查询访问这些引用表,但不更改它们,所以我试图弄清楚是否仍然会有明显的性能影响?
谢谢
这个问题的答案是肯定的和否定的。
没有为什么
当为更改数据捕获启用表时,将创建关联的捕获实例以支持源表中更改数据的传播。捕获实例由一个更改表和最多两个查询函数组成。
未跟踪的表似乎不参与跟踪数据。
是的,因为
变更数据捕获的变更数据源是 SQL Server 事务日志。当插入、更新和删除应用于跟踪的源表时,描述这些更改的条目将添加到日志中。日志用作变更数据捕获过程的输入。这会读取日志并将有关更改的信息添加到跟踪表的关联更改表中。
由于更改的来源来自事务日志,因此更改的传播需要捕获实例读取和解释事务日志(免责声明:我对事物的解释)。仅启用 CDC 就会对整个数据库产生性能影响。
建议
贮存:
- 在规划变更数据捕获架构时,请考虑日志大小和日志卷 I/O 操作的显着增加。
- 考虑在 sys.sp_cdc_enable_table 中指定一个文件组。
- 考虑在执行 sys.sp_cdc_enble_db 之前更改数据库的默认文件组,以便更改数据捕获元数据,尤其是 cdc.lsn_time_mappings 位于与 PRIMARY 不同的文件组中。
工作负载行为:
- 尽量避免插入后需要立即更新行的情况。
- 尽量避免使用更改数据捕获来捕获对具有频繁大型更新事务的表的更改。
更改数据捕获参数:
- 始终将变更数据捕获捕获的列列表减少到您真正需要跟踪的列。
- 如果您不需要支持净更改,请将 @ 设置为 0。
- 用于查看变更数据捕获是否能够跟上您的工作量。
- 如果更改数据捕获无法跟上您的工作量,请修改扫描作业参数并重新启动扫描作业。
结论
如果您的服务器当前在跟上其负载方面没有问题,我非常怀疑您是否会注意到启用 CDC 以处理不经常更改的表的任何性能问题。
来源