SQL同一数据库两个表数据同步(100分求方案)

sknice 2017-07-16 07:33:39
项目表 (表A
------------------------
ID ProjectID TaskName,manager
001 1 设计阶段 张三
002 1 生产阶段 李四
003 2 设计阶段 王五
004 2 生产阶段 赵六


项目负责人表 (表B
-----------------------
ProjectID DesignManager ProduceManager
1 张三 李四
2 王五 赵六
系统上线的时候建的是表A,随着数据量的增加,发现表A的结构查询的时候特别慢,所以想改成表B的结构。
现在要实现对表A进行增、删、改时,把数据同步到表B中。
我现在想的是两个方案
(1) 把项目中所有对表A的增、删、改操作,都改成对表B的操作,缺点是代码量很大,改完还要系统测试,代价太大。
(2)表A中添加触发器,把表A中的数据写到表B中,缺点是太耗性能,执行速度很慢,而且触发器会锁表,一旦表A中数据有变化,表A和表B都会锁住,查询都无法执行。

所以我想请教更好的办法。大家都是怎么做数据同步的?


...全文
2596 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang_peng_yl 2017-07-24
  • 打赏
  • 举报
回复
建议用1方法, 触发器不建议用。
zhouyuehai1978 2017-07-24
  • 打赏
  • 举报
回复
感觉A表的结构查询速度并不会差 最多显示的时候需要行转列,但是你给客户一次显示70w条吗?
繁花尽流年 2017-07-18
  • 打赏
  • 举报
回复
数据要求实时度不高的话针对A表衍生一张B表数据不行嘛? 衍生SP自己设作业多久跑一次。A表数据小的话,每次全量衍生B表就行了。感觉慢的话考虑增量衍生。为什么一定要触发器。
OwenZeng_DBA 2017-07-18
  • 打赏
  • 举报
回复
引用 楼主 sknice 的回复:
项目表 (表A) ------------------------ ID ProjectID TaskName,manager 001 1 设计阶段 张三 002 1 生产阶段 李四 003 2 设计阶段 王五 004 2 生产阶段 赵六 项目负责人表 (表B) ----------------------- ProjectID DesignManager ProduceManager 1 张三 李四 2 王五 赵六 系统上线的时候建的是表A,随着数据量的增加,发现表A的结构查询的时候特别慢,所以想改成表B的结构。 现在要实现对表A进行增、删、改时,把数据同步到表B中。 我现在想的是两个方案 (1) 把项目中所有对表A的增、删、改操作,都改成对表B的操作,缺点是代码量很大,改完还要系统测试,代价太大。 (2)表A中添加触发器,把表A中的数据写到表B中,缺点是太耗性能,执行速度很慢,而且触发器会锁表,一旦表A中数据有变化,表A和表B都会锁住,查询都无法执行。 所以我想请教更好的办法。大家都是怎么做数据同步的?
上面的表是表的全部字段吗?70W数据和这些字段的话,性能肯定不会有什么问题,优化语句吧。不要想着改表结构了
shinger126 2017-07-18
  • 打赏
  • 举报
回复
引用 5 楼 sknice 的回复:
[quote=引用 3 楼 sinat_28984567 的回复:] 用表B会比表A快很多吗?是怎么查询的,换成B之后快在哪里?
我的例子写的比较简单,实际上每个项目很20个阶段,每个阶段有好多数据,在查询和显示的时候需要进行行转列。 系统刚上线时,数据量比较小,行转列1秒就行了,现在表中有70万条数据,行转列好20秒,时间太长了,客户接受不了。 [/quote] 区区70W条数据而已,即使做行转列,也不会慢到哪里,你们要检查,索引有没有建,查询有没有用到索引,索引是否恰当
二月十六 版主 2017-07-17
  • 打赏
  • 举报
回复
引用 5 楼 sknice 的回复:
[quote=引用 3 楼 sinat_28984567 的回复:] 用表B会比表A快很多吗?是怎么查询的,换成B之后快在哪里?
我的例子写的比较简单,实际上每个项目很20个阶段,每个阶段有好多数据,在查询和显示的时候需要进行行转列。 系统刚上线时,数据量比较小,行转列1秒就行了,现在表中有70万条数据,行转列好20秒,时间太长了,客户接受不了。 [/quote] 恩换成B表结构之后呢?70W数据查询多长时间,客户鞥接受吗?
吉普赛的歌 版主 2017-07-17
  • 打赏
  • 举报
回复
引用 5 楼 sknice 的回复:
我的例子写的比较简单,实际上每个项目很20个阶段,每个阶段有好多数据,在查询和显示的时候需要进行行转列。 系统刚上线时,数据量比较小,行转列1秒就行了,现在表中有70万条数据,行转列好20秒,时间太长了,客户接受不了。
如果只有70万数据, 不算多。可以用触发器。 触发器为人所诟病, 并不是触发器本身怎么不好, 而是触发器内部执行的操作拖慢了速度。 如果触发器执行的操作本身很简单, 影响并没有那么的大。 另外, 这个表的增、删、改很频繁么?如果不频繁, 而触发器的效率并不低, 是可以接受的。 具体的, 你可以实际测试下:用触发器到底会降低多少效率? 当然, 触发器要实现的操作, 你需要精心控制, 尽量减少不必要的操作。 比如: 增加、修改、删除某一个用户的记录, 不要更新B表的所有内容, 只处理这个用户的B表记录即可。 如果你采用其它方式来同步, 当然也可以, 但就做不到“同步”。 因为其它方式都是“异步”的, 你只能接受延时。 当然, 效率最高的方式(完全不用触发器, 也不用其它辅助方式)是: 1. 先 生成 B 表; 2. 对A表的增、删、改操作完成后, 立即更新B表。如果A表的操作都是用存储过程在做, 这个改造是非常简单的。
sknice 2017-07-16
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
用表B会比表A快很多吗?是怎么查询的,换成B之后快在哪里?
我的例子写的比较简单,实际上每个项目很20个阶段,每个阶段有好多数据,在查询和显示的时候需要进行行转列。 系统刚上线时,数据量比较小,行转列1秒就行了,现在表中有70万条数据,行转列好20秒,时间太长了,客户接受不了。
sknice 2017-07-16
  • 打赏
  • 举报
回复
引用 1 楼 yenange 的回复:
[quote=引用 楼主 sknice 的回复:] 我现在想的是两个方案 (1) 把项目中所有对表A的增、删、改操作,都改成对表B的操作,缺点是代码量很大,改完还要系统测试,代价太大。 (2)表A中添加触发器,把表A中的数据写到表B中,缺点是太耗性能,执行速度很慢,而且触发器会锁表,一旦表A中数据有变化,表A和表B都会锁住,查询都无法执行。
还是按方案一吧。 辛苦一时, 幸福一世。 同步, 始终会有消耗, 特别是很大的表, 非常不值得。 当然, 你想弄, 始终是有办法, 有比触发器消耗更小的办法: sqlserver2008: cdc http://blog.csdn.net/dba_huangzj/article/details/8130448 sqlsever2016 历史记录表 http://blog.csdn.net/burgess_liu/article/details/51557520 [/quote] 多谢,我们的数据库是2014,先研究下 sqlserver2008: cdc
二月十六 版主 2017-07-16
  • 打赏
  • 举报
回复
用表B会比表A快很多吗?是怎么查询的,换成B之后快在哪里?
吉普赛的歌 版主 2017-07-16
  • 打赏
  • 举报
回复
还是不建议同步。 这些都是无谓的对服务器的消耗。
吉普赛的歌 版主 2017-07-16
  • 打赏
  • 举报
回复
引用 楼主 sknice 的回复:
我现在想的是两个方案 (1) 把项目中所有对表A的增、删、改操作,都改成对表B的操作,缺点是代码量很大,改完还要系统测试,代价太大。 (2)表A中添加触发器,把表A中的数据写到表B中,缺点是太耗性能,执行速度很慢,而且触发器会锁表,一旦表A中数据有变化,表A和表B都会锁住,查询都无法执行。
还是按方案一吧。 辛苦一时, 幸福一世。 同步, 始终会有消耗, 特别是很大的表, 非常不值得。 当然, 你想弄, 始终是有办法, 有比触发器消耗更小的办法: sqlserver2008: cdc http://blog.csdn.net/dba_huangzj/article/details/8130448 sqlsever2016 历史记录表 http://blog.csdn.net/burgess_liu/article/details/51557520

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧