update时间太长

又被套路了 2017-08-07 09:27:47
有两张表,一张mstr表,一张import表,都是300列10万行,现在要把import的数据根据id和corp复合主键进行更新到mstr表,怎么更新会比较快?
...全文
406 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2017-08-07
  • 打赏
  • 举报
回复
建议从业务逻辑的方向考虑优化, 例如同步时,不需要每次都更新全部记录(十几年的数据...), 可以只更新可能变更到的记录即可(例如最近2年的).
顺势而为1 2017-08-07
  • 打赏
  • 举报
回复
看能不能从条件方面来判断。 比如这10w记录中, 可能不是所有的记录都要写完300字段的, 有些可能只是更新某一个字段. 是否可根据条件来分开写 ?
OwenZeng_DBA 2017-08-07
  • 打赏
  • 举报
回复
引用 5 楼 baidu_36531563 的回复:
这个动作是做数据同步的,在数据库服务自动同步失败的情况下,进行手动同步数据,所以更新数据量大,十几年的老数据库了,虽然知道冗余的列很多,但是一改要改很多程序,有点动弹不得
虽然是手动同步,但是由于数据量大,而且列数多。建议你还是写个脚本,分批次的更新,比如10w行分析1000行一次,,循环去处理。这样会比较好。
二月十六 2017-08-07
  • 打赏
  • 举报
回复
引用 5 楼 baidu_36531563 的回复:
这个动作是做数据同步的,在数据库服务自动同步失败的情况下,进行手动同步数据,所以更新数据量大,十几年的老数据库了,虽然知道冗余的列很多,但是一改要改很多程序,有点动弹不得
1、手动同步的时候可以就同步没有同步过来的数据,不同步全部,不知道现在是不是这样的; 2、架构重构吧,长痛不如短痛。
又被套路了 2017-08-07
  • 打赏
  • 举报
回复
这个动作是做数据同步的,在数据库服务自动同步失败的情况下,进行手动同步数据,所以更新数据量大,十几年的老数据库了,虽然知道冗余的列很多,但是一改要改很多程序,有点动弹不得
OwenZeng_DBA 2017-08-07
  • 打赏
  • 举报
回复
引用 楼主 baidu_36531563 的回复:
有两张表,一张mstr表,一张import表,都是300列10万行,现在要把import的数据根据id和corp复合主键进行更新到mstr表,怎么更新会比较快?
这个表列数太多了。建议拆分下。另外,这个更新语句,你没加where条件吗,一次吧10万行的数据都更新了?
UPDATE mstr  set
state=a.state,
p_in_date=a.p_in_date
from import a where a.id=mstr.emp_id
and a.corp=mstr.corp and mstr.corp='01'
二月十六 2017-08-07
  • 打赏
  • 举报
回复
引用 2 楼 baidu_36531563 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:] 300列?好多啊…… 楼主自己写的语句是什么样的?另外表索引情况也说一下。
索引就是那个id和corp了 要更新的是其中的100个列 UPDATE mstr set state=a.state, p_in_date=a.p_in_date from import a where a.id=mstr.emp_id and a.corp=mstr.corp and mstr.corp='01' sql大概就这样,不过写了100个列。。。 不知道怎么写能快一些,现在这个update要更新10分钟[/quote] 语句已经够简洁了; 是一次性更新吗?一次性的时间长点就长点吧; 如果是需要多次做这个操作,我觉得可以从设计上再考虑考虑;
又被套路了 2017-08-07
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
300列?好多啊…… 楼主自己写的语句是什么样的?另外表索引情况也说一下。
索引就是那个id和corp了 要更新的是其中的100个列 UPDATE mstr set state=a.state, p_in_date=a.p_in_date from import a where a.id=mstr.emp_id and a.corp=mstr.corp and mstr.corp='01' sql大概就这样,不过写了100个列。。。 不知道怎么写能快一些,现在这个update要更新10分钟
二月十六 2017-08-07
  • 打赏
  • 举报
回复
300列?好多啊…… 楼主自己写的语句是什么样的?另外表索引情况也说一下。
吉普赛的歌 2017-08-07
  • 打赏
  • 举报
回复
更新整个表不明智, 应该只更新所需要才对。 如果有类似updateTime的时间字段, 可用时间字段来限制需要更新的记录。 如果没有, 可以用 触发器或 CDC 表(2008+)的方式记录下需要更新的记录, 一天之内应该也没有多少数据的了。 如果增、删、改不频繁, 直接触发器更新都可以的, 不需要程序再多此一举了。
OwenZeng_DBA 2017-08-07
  • 打赏
  • 举报
回复
引用 10 楼 baidu_36531563 的回复:
因为是在.net程序中使用DbHelperSQL类中的ExecuteSql方法进行执行sql,所以一次性更新十万条数据会出现等待超时的情况,所以这边现在改成分批update,每2000条数据更新一次。
行,问题解决了就结贴。
又被套路了 2017-08-07
  • 打赏
  • 举报
回复
因为是在.net程序中使用DbHelperSQL类中的ExecuteSql方法进行执行sql,所以一次性更新十万条数据会出现等待超时的情况,所以这边现在改成分批update,每2000条数据更新一次。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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