各位新年快乐:
我遇到了这样一个需求:
几千万条的数据做更新或新增到A表,被更新的原始数据存储到B表,并且B表不能有重复数据 。 各位,请问怎么做最好啊 ?可以谈谈自己的看法吗?请抛砖引玉。
数据库是SQL SERVER。
非常感谢。
方案1:如果从数据库上考虑
1、A表加触发器,A表发生更新或者新增前,先将旧数据插入B表;
2、B表增加唯一索引,保证插入的数据唯一性;
缺点:DB由DBA维护;增加触发器,会导致项目维护难度增加。
优点:实现简单,上层不需要做改动;
方案2:A表批量更新和新增,B表批量插入
前提:A表创建索引
1、有几千万数据增加或者新增,每一次拿1000条(一批次),拿这1000条数据分别查一下A表(每一条数据是否需要更新或者新增到A表);
2、查的时候直接取出来,如果A表有数据,就将取出的数据暂存;或者需要新增到A表,也同样暂存;
3、一个批次(1000条)处理完后,将暂存的数据(需要新增或者更新到A表的数据)插入到B表;
4、将一个批次的数据插入或者更新到A表;
优点:批量更新,耗时相对较少;
缺点:串行操作,耗时将对较高;
建议:B表插入可能会重复,可以使用insert ignore......
方案3:优化方案2,增加消息队列
方案2的缺点是串行操作,那么就可以将其改为并行,使用消息队列(MQ),比如Kafka
用 kafka 和 hadoop
用程序写一个呗. 这种的你用c# 或者 vb.net都可以.
同意一楼的方案一,业务复杂维护相对也会变复杂