求大神帮忙优化下sql,或者给个建议

星夜北极星 2017-07-09 12:06:03
需求:一张表中有很多天的业务数据,时间是字段bssj,每一天hphm,cdxyh,ywzhgxrq相同的字段值,视为同一笔业务数据。当某条数据的字段qzgxbz为1时,用此数据把时间靠前的数据更新掉。
这个sql奇怪的地方在于,同一个表,同样的数据,执行这个sql,有时候很快,有时候很慢,我测试的时候,全表200万数据,qzgxbz=1的有50万条,这50万条分为5个日期,20170531、20170601、20170602、20170603、20170604,每个日期10万条,需要用20170604更新掉前面4个日期数据。于是我执行这个sql,执行前先备份表。第一次执行耗时47秒;恢复表数据,第二次执行2个多小时,还没执行完;第三次恢复数据再执行56秒;第四次,第五次每次都不一样,差别太大!不知道什么原因!!!

update only ods_cims_yhcdhp as a
set (sjxt,cdrq,fkrq,dbbz,cprq,fkhhh,fkhhm,cprzh,dwdm,cpyhjgmc,skrzh,kmh,skrmc,skrkhhmc,bz,je,dqrq,bzjkhzjhm,bzjkhzjlx,bzjhm,bzjje,bzjbl,dkbz,hpzt,qzgxbz,cpyhjrjgdm,dqsbm,data_state,update_flag,pro_flag)=(e.sjxt,e.cdrq,e.fkrq,e.dbbz,e.cprq,e.fkhhh,e.fkhhm,e.cprzh,e.dwdm,e.cpyhjgmc,e.skrzh,e.kmh,e.skrmc,e.skrkhhmc,e.bz,e.je,e.dqrq,e.bzjkhzjhm,e.bzjkhzjlx,e.bzjhm,e.bzjje,e.bzjbl,e.dkbz,e.hpzt,'0',e.cpyhjrjgdm,e.dqsbm,'1','1','0')
from
(select c.sjxt,c.cdrq,c.fkrq,c.dbbz,c.hphm,c.cdxyh,c.ywzhgxrq,c.cprq,c.fkhhh,c.fkhhm,c.cprzh,c.dwdm,c.cpyhjgmc,c.skrzh,c.kmh,c.skrmc,c.skrkhhmc,c.bz,c.je,c.dqrq,c.bzjkhzjhm,c.bzjkhzjlx,c.bzjhm,c.bzjje,c.bzjbl,c.dkbz,c.hpzt,'0',c.cpyhjrjgdm,c.dqsbm,'1','1'
from ods_cims_yhcdhp as c,
(select hphm,cdxyh,ywzhgxrq,max(bssj)as mb from ods_cims_yhcdhp
where qzgxbz='1'
group by hphm,cdxyh,ywzhgxrq) as b
where c.qzgxbz='1' and c.hphm=b.hphm and c.cdxyh=b.cdxyh and c.ywzhgxrq=b.ywzhgxrq and c.bssj=b.mb
) as e
where (a.hphm,a.cdxyh,a.ywzhgxrq)=(e.hphm,e.cdxyh,e.ywzhgxrq)
...全文
406 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxiangqing 2017-07-24
  • 打赏
  • 举报
回复
应该要把以前的数据放到历史表里去,历史表只供查询用
吉普赛的歌 2017-07-24
  • 打赏
  • 举报
回复
数据量太大时,应该分历史表和当前表, 历史表保存基本不再处理的数据, 当前表保存最近的一些数据。 这样对快速处理有非常大的帮助, 也减少了死锁。
  • 打赏
  • 举报
回复
死锁,你是如何解决的?
OwenZeng_DBA 2017-07-16
  • 打赏
  • 举报
回复
引用 1 楼 muqinghuang 的回复:
问题原因已找到,死锁的问题。
问题已经解决了吗
二月十六 2017-07-15
  • 打赏
  • 举报
回复
星夜北极星 2017-07-15
  • 打赏
  • 举报
回复
问题原因已找到,死锁的问题。

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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