1.要优化的语句:把表的5个字段同步到另外一个表
update bu_clear_detail_bak20160412 a
set (a.card_ser_numer,
a.trans_amount2,
a.trans_type_mark,
a.card_online_num,
a.trans_number,
a.issr_mark) =
(select b.card_ser_numer,
b.trans_amount2,
b.trans_type_mark,
b.card_online_num,
b.trans_number,
b.issr_mark
from bu_clear_detail_bak_addcolmns b
where a.id = b.id);
表的统计数据:bu_clear_detail_bak20160412 有23万数据,bu_clear_detail_bak_addcolmns有30万数据。表上没有约束,没有其他的锁。
这个语句执行了30分钟后,还是没有结果。kill掉。
2.两个表数据量不大。为了确定这个语句能不能更新,是否有锁,可以加个约束条件,执行1000条。如:
update bu_clear_detail_bak20160412 a
set (a.card_ser_numer,
a.trans_amount2,
a.trans_type_mark,
a.card_online_num,
a.trans_number,
a.issr_mark) =
(select b.card_ser_numer,
b.trans_amount2,
b.trans_type_mark,
b.card_online_num,
b.trans_number,
b.issr_mark
from bu_clear_detail_bak_addcolmns b
where a.id = b.id)
where rownum < 1000 ;
时间为3分18秒。这个可以证明的是:更新语句没有被其他对象锁住。更新速度很慢。
3.猜想这个语句的执行计划,应该不难,从bu_clear_detail_bak20160412表里取出一条数据,去bu_clear_detail_bak_addcolmns表中检索相同的ID,然后把5个字段更新如此循环100次。bu_clear_detail_bak_addcolmns表有30万数据,循环30万X100次。是不是想到解决办法了,对,就是加索引。在表bu_clear_detail_bak_addcolmns的ID列加索引。测试,全部更新,30秒完成
4.问题是完美解决了,但是研究没有停止.把表bu_clear_detail_bak_addcolmns的索引删除,我们来看看它执行的系统指标表现:
us为20%,用10046事件跟踪SQL都是db file scattered read等待事件,TOP SQL





来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30393770/viewspace-2081993/
,如需转载,请注明出处,否则将追究法律责任。