Oracle SQL最佳更新

时间:2015-10-25 20:22:10

标签: sql oracle performance plsql sql-update

我有两个表中的数据:

**Supplier:** ERPSupplier, RMSSupplier

**ItemLoc:** Item, Location, Supplier

ItemLoc中的供应商是Supplier表中的ERPSupplier。在与ERPSupplier进行比较后,我需要替换RMSSupplier。

进行更新的最佳方式是什么? ItemLoc表中有1000万条记录。

目前我正在使用PlSQL Block,但它花了太多时间:

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 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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在这方面有一些考虑因素。