加载数据或更新列oracle sql

tkclm6bt  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(384)

我有一个非常大的表(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子句的条件只加载字段?或者插入我的域…谢谢你的帮助。

vtwuwzda

vtwuwzda1#

第1种方法
在big-fat表中的多个列上创建一个索引

create index <index_name> on <table_name> (DEP, EMP, FA, LO);

第二种方法
虽然我怀疑它是否能解决性能问题,但有一个解决方案可以解决最大1000 in参数的问题。
你可以通过这样的2值比较来解决这个问题

UPDATE My_table
SET    DAC = ...
WHERE  DEP ='98001'
AND    EMP ='333'
AND    ('dummy',FA) IN (('dummy','123'),('dummy', '321'), ('dummy','234'), …. around 10 000 FA);

这样的话,最大值为100000。
另一个提示
检查dep、emp、fa和lo列的数据类型,您可能正在进行varchar2和数字比较。尽管它可以工作,但oracle确实执行了一个隐式转换,以便能够进行比较,这可能会在比较大量的值时导致性能问题。

相关问题