【问题标题】:Oracle SQL optimal updateOracle SQL 优化更新
【发布时间】:2016-01-24 21:32:59
【问题描述】:

我有两个表中的数据:

**Supplier:** ERPSupplier, RMSSupplier

**ItemLoc:** Item, Location, Supplier

ItemLoc 中的供应商是供应商表中的 ERPSupplier。与 ERPSupplier 比较后,我需要替换 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;

【问题讨论】:

    标签: sql oracle performance plsql sql-update


    【解决方案1】:

    根据您使用的 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 在这方面有一些考虑。

    【讨论】:

    • 绝对使用单个 SQL 语句,并且只更新新值与旧值不同的地方。
    【解决方案2】:

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

    【讨论】:

    • 单行查询在添加索引后完成了这项工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2014-12-22
    相关资源
    最近更新 更多