提到同步数据,大最为较关怀的便是怎么尽或许地削减每次的同步数据量,以此来进步同步功率,下降对网络带宽的耗费。针对大批量的数据同步,这一点是有必要留意的。处理这个问题的要害点在于获取差异数据,这也便是说,咱们只是同步改动了的数据,至于没有改动的,就不再同步。下文中,咱们将介绍削减每次同步数据量的6个办法:
1.日期栏位(时刻戳)
一般情况下,在规划表的时分,增加两个日期栏位,CreatedOn, ChangedOn, 别离记载数据发生时刻和改动时刻。同步程序能够依据两个栏位来获取差异的数据。
2.Trigger
它能够实时获取差异数据, Trigger运用较为简略,不需求改动原表的结构,能够只监督部分的栏位改动,以获取你需求的改动数据,并对数据做二次处理。Trigger需求你对源表的保护情况比较了解,不然或许发生一些意想不到的影响。
3.SQLServer自身的仿制服务
自身支撑多种数据同步办法,功用很强壮,可是运用上会比较复杂,并且假如在同步过程中,需求对差异数据做二次处理,好像无路可走。
这种办法能够确保随时获取某个时刻段内新增(改动)的数据,一起关于追寻问题也大有裨益。可是缺点也不少,其一是这两个栏位完全由开发人员操控,实在确保这两个栏位每次都得到正确的保护比较困难,其二是不简略确认你下一次取差异数据的基准时刻。
4.timestamp栏位
timestamp能够理解为行的版本号,每次刺进或更新包括 timestamp 列的行时,timestamp 列中的值均会更新。运用这一特性,树立一个包括源表ID和timestamp值的基准表,就能够找到哪些数据发生改动了,每次同步成功后,再更新该基准表。
5.监控并记载根据某数据目标的一切DML句子
这种办法,我没有详细尝试过,可是一个很不错的思路,假如网络情况糟糕,并且对数据实时性要求不高,能够选用。详细做法是每天守时获取你需求同步表的一切update, delete句子,然后定点打包发送到别的一台服务器履行。
6.运用BINARY_CHECKSUM
这个是我以为最简略的办法。BINARY_CHECKSUM是SQLServer内置的一个聚合函数,它能够针对一行,或许某些列核算出一个值,假如它核算的那些列中的任何一个值发生改动,那么那个核算值就会发生改动。这样我只需树立一个包括源表ID和开始核算值的基准表,就能够找到哪些数据发生改动了,每次同步成功后,再更新该基准表。与办法4不同的是,BINARY_CHECKSUM能够只监督部分改动的栏位,这一点又类似于Trigger了。
运用BINARY_CHECKSUM有些约束,由于它在核算中会疏忽具有不可比数据类型的列(不可比数据类型是 text、ntext、image、cursor 以及根本类型为前4个数据类型之一的 sql_variant),所以假如要监控这些列改动,这种办法是不起作用的。