最近有个项目要做两个数据库中两个表(源表为A、B表,目标表为A+和B+)的同步、比较,主要是将源表与目标表进行同步,每次同步时要将差异记录(新增、删除、修改的记录)进行逐条保存,并保存历史信息、写日志表(且A表与A+同步要操作B+表记录)。
开始估计数据量不大,测试数据大概是A表3万条、B表3万条进行同步操作,每次差异记录大概1.5万条。设计了一存储过程实现同步,主要使用了4个游标、很多的exists或not exists语句、很多的更新操作。同步一次大概10到20分钟。
后来拿到真实数据,数据量比前期估计相差很大,A表实际有400万条左右、B表100多万条,每次差异大概6-7万条,原有存储过程根本无法执行。
后期进行优化后,同步时间大概6到15分钟,主要优化的点有:
1、取消游标,使用别的方法进行处理;
2、将所有的exists或not exists转成连接(left join、inner join、right join);
3、将更新数据量大的update语句使用delete->insert实现,具体是将要同步更新的源记录插入一个结构相同的临时表,然后删除目标表的需同步更新的记录,最后将临时表中的数据插入目标表;
(在Oracle中实现,未使用工具)