问题描述
- 请教高手如何优化下面oracle语句,19W条数据花了几个小时 3C
- update agz set fa_id=(select B from B123 where a=agz.old_fa_id);
commit;
update agz set person_id=(select ry.id from dm_gy_ry ry where ry.sfzjhm=agz.ry_sfz and ry.yxbz='Y' and rownum=1);
commit;
update agz set person_depart=(select ry.jg_id from dm_gy_ry ry where ry.id=agz.person_id);
commit;
update agz set pperson_dw=(select jg.dw_id from dm_gy_jg jg where jg.id=agz.person_depart);
commit;
update agz set shs=( select fa.fk_px_ss_chs_id from t_px_ss_fa fa where fa.c_id=agz.fa_id);
commit;
解决方案
通常不需要用子查询。拿第一个sql来说,调整成下面这样
update agzB123 set fa_id=B where a=agz.old_fa_id;
其他sql类似方式把子查询""解放""出来。
当然这样还不够,要确保where条件可以用上合适的索引。
还拿第一个sql来说,如果agz.old_fa_id或者B123.a上有索引的话,执行调整后的sql效率会提高。
解决方案二:
先检索出结果,在更新,不要写一块
解决方案三:
update agz set fa_id=(select B from B123 where a=agz.old_fa_id);
这条sql语句本身没有问题,建议你agz.old_fa_id和B123.a建立一个索引,速度就上去了
解决方案四:
语句都很简单,没有多少优化的余地,对条件列建索引吧, 哪个语句慢就关注where条件的列
解决方案五:
用MERGE 来更新
时间: 2024-11-01 10:22:56