从SQL Oracle中的其他(巨大)表更新大表

时间:2017-11-22 12:02:19

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

我有两张大桌子:

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

表2(id_num,field1,field2,field3)~4M行

我需要根据Table2.id_num更新Table2数据中的Table2,该数据应该在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;

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

2 个答案:

答案 0 :(得分:0)

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

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)

答案 1 :(得分:0)

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

这种方式对于大型桌子会更好。

创建表Newtable nologging pctfree 0 如 选择要保留的t1.field1,t1.field2,t.field3,.. t2.columns 从table1 t1,tab2 t2,其中t1.form_id = t2.to_id。

我希望这会有所帮助

由于 Thangamani Eraniyan