我读到启用变更数据捕获显然会对数据库性能产生影响。 这种性能损失是否只会影响启用了 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 时出现的任何性能问题。
来源