表格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个小时。
答案 0 :(得分:0)
我的猜测是你的问题是重复执行你的子查询。我甚至不确定第二个(在WHERE EXISTS内部)做了什么有用的事情。
请详细说明我的第二个建议:
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
)
;