数据库A为主数据库(在服务器A上),数据库B为子数据库(在服务器B上),两者中表C结构相同,定时从B库中读取数据和A库中的数据做对比,如果有添加数据,则插入A库,如果有修改,则更新A库。
现在是使用C#获取B库中的数据,使用循环和A库中对比。问题,是A库的数据比较多,对比的过程很慢,求更快,更高效的对比方法!!!!
------解决思路----------------------
直接覆盖表不行吗?
1.有新增插入,这种删掉B库C表数据,从A库C表拉数据没有影响;
2.有更新修改,同样的方式也没有影响;
3.A库C表有删除的,用覆盖方式是将B库C表的数据也相当于删除掉了,就是不知道A库C表删除时楼主对于B库C表是如何处理的。
------解决思路----------------------
如果你的子数据库和主数据库网络能够连通,可以看看链接服务器的用法!
加一个脚本在每一个子数据库,建立主数据库的链接服务器,拉出C表数据,直接覆盖到子数据库的C表!
如果觉得删除数据比较慢,可以将子数据库的C表重命名为C表加日期,然后创建C表,再插入数据,起码会在这段时间避免删除数据所需的资源,再在数据库空闲的时间删除前一个月或者一两周类似C表加日期的备份表!
------解决思路----------------------
做个数据增量同步,然后再在一台SVR上对比,从效率上来说是最优的
只是增量同步稍麻烦点
------解决思路----------------------
直接在B库上添加JOB定时执行(2008以上可以用MERGE,以下就直接写存储过程实现你要的同步就可以了)
跨服务器要先添加链接服务器,或者在语句中用OPENROWSET/ OPENDATASOURCE
------解决思路----------------------
在原始數據裡面增加標記欄位 以達到看哪些數據有更新並且新增 只針對新增更新的數據進行同步 應該數據會少很多
------解决思路----------------------
前不久我們的項目也是這樣的,我們採用的方法是通過寫腳本文件執行,希望對樓主有幫助
------解决思路----------------------
如果有自增id字段,判断有 新增 就很简单高效了
如果在修改C的同时,插入一条 该了什么 记录到自己的日志表D,则判断 修改也很简单高效了
------解决思路----------------------
可以使用MERGE语句同步表
--测试数据
USE TEMPDB
GO
IF OBJECT_ID('T1') IS NOT NULL DROP TABLE T1
IF OBJECT_ID('T2') IS NOT NULL DROP TABLE T2
GO
CREATE TABLE T1(ID1 INT,VAL1 VARCHAR(50))
CREATE TABLE T2(ID2 INT,VAL2 VARCHAR(50))
GO
INSERT INTO T1
SELECT 1,'A' UNION ALL
SELECT 2,'B' UNION ALL
SELECT 3,'C'
--现在我们的目标是让T2表与T1表同步
MERGE INTO T2 AS TB_TARGET
USING T1 AS TB_SOURCE
ON TB_TARGET.ID2=TB_SOURCE.ID1
WHEN NOT MATCHED BY TARGET THEN
INSERT(ID2,VAL2)
VALUES(ID1,VAL1)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
WHEN MATCHED AND TB_TARGET.VAL2<>TB_SOURCE.VAL1 THEN
UPDATE SET
TB_TARGET.VAL2=TB_SOURCE.VAL1
OUTPUT $ACTION,ISNULL(DELETED.ID2,INSERTED.ID2) AS ID,DELETED.VAL2,INSERTED.VAL2
;
------解决思路----------------------
设置个复制就可以,你这个是单向的
------解决思路----------------------
采用DBTWIN集群直接做到数据的实时同步,数据零丢失,负载均衡。