【问题标题】:Update huge table from other (huge) table in SQL Oracle从 SQL Oracle 中的其他(巨大)表更新巨大的表
【发布时间】:2017-11-22 12:02:18
【问题描述】:

我有两张大桌子:

Table1 (from_id, to_id, field1, field2, field3) ~ 500K 行

Table2 (id_num, field1, field2, field3) ~4M 行

我需要根据 Table2.id_num 从 Table1 数据中更新 Table2,Table2.id_num 应该在 Table1.from_id 和 Table1.to_id 之间。

在两个表中 - ID 值可以在 16,000,000 和 4,300,000,000 之间变化。

我运行了以下光标脚本,但它运行了几个小时,还没有完成。

DECLARE
 l_FROM_ID                Table1.FROM_ID%TYPE;
 l_TO_ID                  Table1.TO_ID%TYPE;
 l_Field1                 Table1.Field1%TYPE;
 l_Field2                 Table1.Field1%TYPE;
 l_Field3                 Table1.Field1%TYPE;

CURSOR cur
     IS
      SELECT
      FROM_ID, TO_ID, Field1, Field2, Field3
      FROM
      Table1  ;
BEGIN
 OPEN cur;
 LOOP
       FETCH cur INTO
        l_FROM_ID,
        l_TO_ID,
        l_Field1,
        l_Field2,
        l_Field3 ;

      UPDATE 
        table2 t
      SET
        t.field1 = l_field1, 
        t.field2 = l_field2,
        t.field3 = l_field3      
      WHERE  t.id_num >= l_FROM_ID and t.id_num <= l_TO_ID;
       commit;
    END LOOP;
    CLOSE cur;
end;

关于如何提高效率的任何想法?

【问题讨论】:

    标签: sql oracle cursor query-performance sql-tuning


    【解决方案1】:

    有很多方法可以加速这一过程。首先,我会尝试一下

    update Table2 t2 set
      (field1, field2, field3) = (select field1, field2, field3 
                                  from Table1 t1 
                                  where t2.id_num between t1.from_id and t1.to_id)
    

    【讨论】:

      【解决方案2】:

      如果您的数据库服务器配置为 OLAP(如 etl /elt 进程)。 您可以使用所需值创建新表并删除现有表,而不是更新。

      这种方式更适合大表。

      创建表 Newtable nologging pctfree 0 作为 选择要保留的 t1.field1, t1.field2, t.field3,..t2.columns from table1 t1, tab2 t2 where t1.form_id=t2.to_id.

      希望对你有帮助

      谢谢 Thangamani Eraniyan

      【讨论】:

        猜你喜欢
        • 2018-06-01
        • 2020-03-18
        • 1970-01-01
        • 2018-09-12
        • 1970-01-01
        • 2013-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多