日期:2014-05-19  浏览次数:20566 次

^^^^关于增量更新的判断^^^^
A服务器上有一个数据库aa,B服务器上有一个数据库bb,bb实际上是定期从aa导来的。
现在的问题是,我想做一个调度来每月将aa中的某个表中改变(update的或者insert的)的纪录导到bb中,我在写脚本的时候,怎么来判断aa中的这个表的哪纪录是我需要的呢?
(不要用触发器)

------解决方案--------------------
在aa表上添加一個時間字段,紀錄 update insert 時的時間,然後根據這個時間來抓數據
------解决方案--------------------
不能用触发器就只能加个最后更新时间字段在aa库的每个表,记录最后修改时间,可以default(getdate()),这样插入的时候能自动取得时间

------解决方案--------------------
在表中增加一个列updatetime,在做update或insert时记录下时间,导的时候就可以参照updatetime里的时间了

------解决方案--------------------

--新增
insert into bb.tablename
select * from
OPENDATASOURCE( 'SQLOLEDB ',

'Data Source=.;User ID=sa;Password=sa '

).aa.dbo.tablename A
where not exists (select * from bb.tablename where 主鍵=A.主鍵)

--更新
update A set FieldName=B.FieldName from bb.tablename A, OPENDATASOURCE( 'SQLOLEDB ',

'Data Source=.;User ID=sa;Password=sa '

).aa.dbo.tablename B
where A.主鍵=B.主鍵 and A.FieldName <> B.FieldName
------解决方案--------------------
不改變當前表的結構,可不可以另外添加一個日志表.
專門紀錄對這個表的操作歷史,時間,更新/insert 的key值
結構:
tablename caozuo key time
aa add 1 20070712
aa update 2 20070821
然後根據這個time 和 key值到aa裡抓數據 to bb表
------解决方案--------------------
按楼主的要求,实现不了。
不用任何附加字段或表,就只能遍历两表求差,这样的在倒数据的时候负载最高,平时无任何影响。
通过添加timestamp字段、datetime字段或者用触发器生成增量表的方式,对于平时的负载,影响很小(当然要看每次数据更新的数据量,通常前台操作都是单记录更新,影响微乎其微),而倒数据时的负载,根据所用方法的不同,有所差异,但一定要比两表求差的负载小得多。如果通过更改表结构来增加timestamp或datetime字段,在倒表的时候需要在整表空间内作数据过滤,即便在有索引的情况下,负载也不小;如果使用增量表,倒数据时仅需对增量表进行查询,如果每次成功倒完后都清理增量表,那么查询是不需要条件的,而且数据量相对很小,应当比较可行。
请楼主参考。
------解决方案--------------------
试下用P2P的MD5较验技术.适用于远程2地文件对比更新.
它的精髓如下:
100M的文件,生成一个文件大小和MD5码.
远程对比大小,符合就再对这个MD5码.
如果不符合,继续传送文件;
远程不符合的文件继续更新数据.
把100M的文件分成2段,每段50M,生成2个MD5码,再交给远程对比.
不符合,再分4段,不符合再分8段.再分16段.....可能分到最小的时候,每10K或100K形成1个MD5窜.

当然,你也可以返过来,先直接每100K或10K数据,拆一个MD5码,然后把它们打包传送到远程对比.


根据这个原理,你也可以在2地数据间,用这种方法进行.
比如先取原表50条记录(只取关键部份,一定需要的),然后把它们拼起来,MD5一次,交给远程,远程也取这50条记录(也只取关键部份,一定需要的)也MD5一次,对得上则OK.对不上,再分条传送对比吧...