插入序列需要很长时间



我在甲骨文中有一个表:

table1
record_id    variable     value
1            100          50
1            101          40
2            100          30
2            101          60
1            102          100

它有超过 700 万行。我想添加另一列作为唯一 ID。因此,该表将如下所示:

table1
id          record_id    variable     value
1           1            100          50
2           1            101          40
3           2            100          30
4           2            101          60
5           1            102          100

但是当我尝试使用以下方法更新它时:

更新表1 SET id = my_sequence.nextval;

这需要很长时间。有没有更快的方法来完成这项工作?

下面是创建表查询:

CREATE TABLE "ABCUSER"."NUM_VAL"
("RECORD_ID" NUMBER(*,0),
"VAR" NUMBER,
"VAR_SEQUENCE" NUMBER,
"VAR_DATATYPE" NUMBER,
"CREATED_DATE" DATE,
"UPDATED_DATE" DATE,
"VAR_VALUE_NUMBER" VARCHAR2(40 BYTE),
"VAR_VALUE_TEXT" VARCHAR2(255 BYTE),
"VAR_VALUE_DATE" DATE,
"ID" NUMBER
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS NOLOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
CREATE INDEX "ABCUSER"."IMD_TB_UNIQUE_ID" ON "ABCUSER"."NUM_VAL" ("RECORD_ID")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;

序列:

创建序列"ABCUSER"。MY_SEQUENCE" 最小值 1 最大值 9999999999999999999999999999 增量 1 从10186338807缓存开始 100 无序无周期 ;

更新所有 700 万行(整个表(必须花费一些时间。
一种更快的方法是创建此表的副本:

CREATE TABLE NUM_VAL_copy AS SELECT 
"RECORD_ID"  ,
"VAR" ,
"VAR_SEQUENCE" ,
"VAR_DATATYPE"  ,
"CREATED_DATE" ,
"UPDATED_DATE" ,
"VAR_VALUE_NUMBER",
"VAR_VALUE_TEXT" ,
"VAR_VALUE_DATE" ,
my_sequence.nextval AS "ID"
FROM NUM_VAL;

然后索引new_table,授予权限,在新表上添加约束等,
最后删除旧表并将新表重命名为旧名称:

DROP TABLE NUM_VAL;
RENAME NUM_VAL_COPY TO NUM_VAL;

有关详细信息,请查看文档:https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9019.htm#SQLRF01608

如果您希望序列以病房上的 1...2...3... 开头,则可以使用以下方法。

update table_name set unique_seq = rownum;

我在一张有 6 条记录的桌子上尝试过,它工作正常。我不是 100% 确定这是否是理想的方式,但我认为它会比 nextval 更快。

稍后,如果您出于某种原因仍然想要定义序列,则可以更新预言机序列以从 max(unique_seq( 数字开始。

  1. 如果您使用的是 Oracle RAC,这可能是一个问题。较小的缓存序列将影响性能。使用无顺序 、缓存来创建序列。

  2. 700 万行并不是一个很大的数字。您可能需要检查更新期间是否遇到应用程序阻止问题。这是一个DBA的工作。他们需要为您检查锁定。

  3. 如果可以创建表作为选择添加值,它将比更新快得多。

将表1重命名为表2; 创建表 表1 从表 2 中选择/*+ 追加 */*、[idvalue] id ;

最新更新