求大神帮忙优化下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)