簡體   English   中英

加載數據或更新列 Oracle-sql

[英]Loading data or updating a column Oracle-sql

我有一個容量很大的表(oracle 11g),我做了數千次更新,但這在性能方面需要幾個小時。 我表中的一些字段和列:

DEP     EMP FA  LO  DAC
98001   333 123 124 null
98001   333 321 132 null
98001   333 234 233 null

這是第一種方法(通過 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 子句的條件僅加載字段? 還是插入我的字段? … 謝謝你的幫助。

第一種方法

在你的大胖表中的多列上創建一個索引

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);

這樣,您最多可以有 100,000 個值。

另一個提示

檢查 DEP、EMP、FA 和 LO 列的數據類型,您可能正在進行 VARCHAR2 與 NUMBER 比較。 盡管它有效,但 oracle 確實執行了隱式轉換以進行比較,這在比較大量值時可能會導致性能問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM