我有一个非常大的表(oracle11g),我做了成千上万的更新,但这在性能方面需要几个小时。我的表中的某些字段和列:
DEP EMP FA LO DAC
98001 333 123 124 null
98001 333 321 132 null
98001 333 234 233 null
下面是第1个方法(通过sql plus执行的查询):
WHENEVER SQLERROR EXIT SQL.SQLCODE
UPDATE My_table set DAC= '5' where DEP ='98001' AND EMP ='333' and FA='123' and LO='124'
UPDATE My_table set DAC= '8' where DEP ='98001' AND EMP ='333' and FA='321' and LO='132'
UPDATE My_table set DAC= '9' where DEP ='98001' AND EMP ='333' and FA='123' and LO='233'
… around 10 000 lines
Commit ;
第二种方法(通过sql plus执行的查询):
UPDATE My_table
SET DAC = (
CASE
when FA='123' and LO='124' THEN '5'
when FA='321' and LO='132' THEN '8'
when FA='234' and LO='233' THEN '9'
… around 10 000 lines
END) where DEP ='98001' AND EMP ='333'
AND FA IN ('123', '321', '234', …. around 10 000 FA);
有没有更快的方法来加载sql字段?根据where子句的条件只加载字段?或者插入我的域…谢谢你的帮助。
1条答案
按热度按时间vtwuwzda1#
第1种方法
在big-fat表中的多个列上创建一个索引
第二种方法
虽然我怀疑它是否能解决性能问题,但有一个解决方案可以解决最大1000 in参数的问题。
你可以通过这样的2值比较来解决这个问题
这样的话,最大值为100000。
另一个提示
检查dep、emp、fa和lo列的数据类型,您可能正在进行varchar2和数字比较。尽管它可以工作,但oracle确实执行了一个隐式转换,以便能够进行比较,这可能会在比较大量的值时导致性能问题。