2015-10-25 88 views
0

我有兩個表中的數據:的Oracle SQL優化更新

**Supplier:** ERPSupplier, RMSSupplier 

**ItemLoc:** Item, Location, Supplier 

在ItemLoc供應商是從供應商表ERPSupplier。與ERPS供應商比較後,我需要替換RMSSupplier。

做更新的最佳方式是什麼? ItemLoc表中有1000萬條記錄。

目前我用PLSQL塊做的,但其花費過多時間:

DECLARE 
    cursor c1 is 
    select * from Supplier; 

BEGIN 

    FOR r in c1 LOOP 

    update mig_item_loc 
     set Supplier = r.RMSSupplier 
     where Supplier = r.ERPSupplier; 

    END LOOP; 

END; 

回答

2

取決於你使用的是Oracle數據庫的版本,你可能會得到一些好處了使用BULK的COLLECT (https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:1203923200346667188)。

我也認爲你應該可以在沒有PL/SQL的情況下完成這個任務。 https://dba.stackexchange.com/questions/3033/how-to-update-a-table-from-a-another-table在這方面有一些考慮因素。

+2

肯定使用一個SQL語句此,並只更新新值與舊值不同的位置。 –

3

@ziesemer是正確的。如果你想讓它更快,那麼你想考慮使用批量收集。這個概念似乎很難在第一把握,但這裏的散裝的示例應用程序代碼中的收集:

DECLARE 
    cursor c1 is 
     select * from Supplier; 
    type RMSSupplier_type is table of Supplier.RMSSupplier%type index by pls_integer; 
    type ERPSupplier_type is table of Supplier.ERPSupplier%type index by pls_integer; 
    tableOfRMSSupplier RMSSupplier_type 
    tableOfERPSupplier ERPSupplier_type; 
    BEGIN 
    select RMSSupplier, ERPSupplier BULK COLLECT INTO tableOfRMSSupplier, tableOfERPSupplier FROM Supplier; 
    FORALL a in 1..tableOfRMSSupplier.COUNT 
     update mig_item_loc 
      set Supplier = tableOfRMSSupplier(a) 
      where Supplier = tableOfERPSupplier(a);    
    END; 

你也可以試試這個單行更新:

update mig_item_loc a 
set a.Supplier = (select b.RMSSupplier from Supplier b where a.Supplier=b.ERPSupplier) 
+0

單行查詢在添加索引後完成了這項工作。 –