SQL Server 2008 CDC功能如何高效捕获数据变更?

您当前的位置:   首页 > 首页 > 解决方案
SQL Server 2008 CDC功能如何高效捕获数据变更?
发布时间:2026-07-09 07:12:25

  3、然后在TestCDC数据库中创建测试表  

USE TestCDC

其中dbo_Product_CT表中的_$operation字段的值是2,_$update_mask字段的值是0x07。 _$operation字段是代表DML操作类型,1是delete,2是insert,3是update的旧值,4是update的新值。

7、再来一次UPDATE  

UPDATE dbo.Product SET Category = N'A' WHERE ProductID = 1;

  提交完这条命令后,在dbo_Product_CT中又看到两条新记录了。其中dbo_Product_CT表中的_$operation字段的值是第一条是3,第二条是4,_$update_mask字段的值两条都是0x04。(看来CDC确实会记录下数据的每次修改。)   8、继续在Product表上提交DML语句  

DELETE dbo.Product WHERE ProductID = 1;

  提交完了这条命令后,就会在lsn_time_mapping和dbo_Product_CT中分别看到一条新记录。

11、最后试一下DROP命令  

DROP TABLE dbo.Product;

  dbo.Product表消失了,同时cdc.dbo_Product_CT表也消失了。   12. 评估结束。一定有人问,捕获到的更新怎么用呢,还有一堆系统函数和存储过程可以帮助用户,但是那段测试的过程就不详细写了。   其中最重要的应该就是cdc.fn_cdc_get_all_changes_和cdc.fn_cdc_get_net_changes_两个函数了,这两个函数可以帮助我们获取dbo_Product_CT表中数据,其中cdc.fn_cdc_get_all_changes_是用于获取所有更新,而cdc.fn_cdc_get_net_changes_则是用于获取精简后的更新,在精简的更新中有一些重复的更新就会被合并成一条记录,比如说我们把产品类型由A改为B,然后又改回A,在cdc.fn_cdc_get_all_changes_中应该有3条记录,而在cdc.fn_cdc_get_net_changes_ 中则只有1条记录。两个函数的范例如下(你会发现精简结果集的函数运算相当慢,至少在CTP4中是这样的,不知道以后的版本会不回有改进):  

SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_Product(0x00000048000001760004, 0x00000048000001F70004, 'all');

SQL Server 2008 CDC功能如何高效捕获数据变更?

SELECT * FROM cdc.fn_cdc_get_net_changes_dbo_Product(0x00000048000001760004,

  从上面两张表中可以看到激活CDC后数据文件的写入和日志文件写入都会显著增加,不过需要考虑到CDC激活后会需要多写一张表,在本例中就是dbo_SalesOrderDetails_CT,所以这种增加是可以理解的。当然在生产环境中并不会对数据表的所有列进行CDC监控,所以激活CDC对IO写入的影响还需要针对不同情况进行分析。  

图5

表1的3个binary(10)字段构成了聚簇索引,同时3个binary(10)字段加上原始数据表的聚簇索引构成一个非聚簇索引,同上面一样,我们假定原始表聚簇索引键是x个字节,那么表1的非聚簇索引每行是(30 + y(假定原始表聚簇索引键尺寸为y个字节) + 4(指向聚簇索引的内部指针))个字节。

3、对原始数据表的一行数据进行UPDATE操作,会在表1中添加2行数据,而DELETE操作和INSERT操作则会增加1行数据;而对于表2则是每笔事务增加1行数据。   因此我们作如下假定,典型的OLTP环境:   1、原始数据表的聚簇索引为1个整型字段,同时需要监控的字段总尺寸为50字节(约为5个decimal(19)或5个char(10))。

SQL Server 2008 CDC功能如何高效捕获数据变更?

声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

IT头条

技术热点