更新主键列时,Oracle Update需要很长时间

时间:2016-07-29 07:53:42

标签: sql oracle performance sql-update

表格EFORMDYNAMICFIELDINSTANCE包含主键(Enterpriseid, Ownertype, Ownerid, Itemtype, Itemid)

为了将主键更改为单列,即EDFI_ID,我们希望以7000000作为增量值更新此EDFI_ID

此表几乎没有50000条记录需要10小时才能更新。 这是我的表格定义:

ENTERPRISEID NOT NULL NUMBER(10),
OWNERTYPE    NOT NULL VARCHAR2(60),
OWNERID      NOT NULL NUMBER(10),
ITEMTYPE     NOT NULL VARCHAR2(60),
ITEMID       NOT NULL NUMBER(10),
EDFI_ID      NOT NULL NUMBER(10),
FIELD1                VARCHAR2(2000), 
FIELD2                VARCHAR2(2000), 
...
FIELD199              VARCHAR2(2000),
FIELD200              VARCHAR2(2000)

之前我们以(ENTERPRISEID, OWNERTYPE, OWNERID, ITEMTYPE, ITEMID)为主键。

现在EDFI_ID是我的主键列,我们希望使用(rownumber + 7000000)更新此主键。此表有大约50000条记录,EDFI_ID应更新为7000000,7000001,7000002 .... 7050000。

请建议UPDATE声明,这将花费更少的时间。截至目前,我的上述UPDATE需要10个小时。

1 个答案:

答案 0 :(得分:0)

我的猜测是你的问题是重复执行你的子查询。我甚至不确定第二个(在WHERE EXISTS内部)做了什么有用的事情。

  1. 删除WHERE EXISTS - 这将消除一半的努力。如果那没有帮助那么......
  2. 创建一个临时映射表,其中包含您所有现有的主键值以及新的PK值。在五个PK列上创建唯一索引。然后使用子查询中的映射表
  3. 请详细说明我的第二个建议:

    CREATE TABLE temp_pk_mapping AS
     (SELECT  
      enterpriseid
     ,ownertype
     ,ownerid
     ,itemtype
     ,itemid
     ,rownum + 70000     new_pk
     FROM  
      (SELECT DISTINCT
        enterpriseid
       ,ownertype
       ,ownerid
       ,itemtype
       ,itemid
       FROM 
        eformdynamicfieldinstance
       )
    )
    ;
    
    CREATE UNIQUE INDEX temp_pk_mapping_u1 ON temp_pk_mapping 
    ( enterpriseid
     ,ownertype
     ,ownerid
     ,itemtype
     ,itemid
    )
    ;
    
    UPDATE eformdynamicfieldinstance edfi
    SET edfi.edfi_id =
     (SELECT new_pk
      FROM temp_pk_mapping map
      WHERE edfi.enterpriseid = map.enterpriseid 
      AND edfi.ownertype = map.ownertype  
      AND edfi.ownerid = map.ownerid  
      AND edfi.itemtype = map.itemtype  
      AND edfi.itemid = map.itemid
      )
    ;