我在甲骨文中有一个表:
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( 数字开始。
-
如果您使用的是 Oracle RAC,这可能是一个问题。较小的缓存序列将影响性能。使用无顺序 、缓存来创建序列。
-
700 万行并不是一个很大的数字。您可能需要检查更新期间是否遇到应用程序阻止问题。这是一个DBA的工作。他们需要为您检查锁定。
-
如果可以创建表作为选择添加值,它将比更新快得多。
将表1重命名为表2; 创建表 表1 从表 2 中选择/*+ 追加 */*、[idvalue] id ;