各位前辈好,
小弟是新手,有个难题向各位前辈帮帮忙。
table_01 需要更新 (有六十多万记录)
table_02 更新用的资料(有五万多记录)
条件:
table_01 有三个column要更新 (member_card,position,salary)
更新的条件是column is null
小弟自己写了个SQL
UPDATE table_01 A SET member_card=(select member_card from table_02 B where A.member_id=B.member_id) WHERE A.member_card IS NULL
更新用了超过40分钟,这才是更新member_card ,还有其他两个的,如果这样要超过两个钟头。
太长了。
请各位前辈帮帮忙,有什么效率高的办法吗?
请赐教。
谢谢
------解决思路----------------------
-- 1.检查 table_01 上没有TR ,如果有,再不影响业务的情况下,可以考虑禁用,更新完了再启用。
alter table table_01 disable all triggers;
alter table table_01 enable all triggers;
2.在table_02 表的 member_id 列,建一个IX。
create index ix_table_02_m on table_02(member_id)
3.你要更新 3 列,这个语句更新了 1 列,其实一个语句可以直接更新多列。
update table_01 set(col1 , col2,col3) = (select c1, c2,c3 from y where table_01.member_id = member_id)
where exists(select * from table_02 where table_01.member_id = member_id)
and .......
------解决思路----------------------
Parallel用途
强行启用并行度来执行当前SQL。这个在Oracle 9i之后的版本可以使用,之前的版本现在没有环境进行测试。也就是说,加上这个说明,可以强行启用Oracle的多线程处理功能。举例的话,就像电脑装了多核的CPU,但大多情况下都不会完全多核同时启用(2核以上的比较明显),使用parallel说明,就会多核同时工作,来提高效率。
但本身启动这个功能,也是要消耗资源与性能的。所有,一般都会在返回记录数大于100万时使用,效果也会比较明显。