【发布时间】:2017-12-05 04:32:22
【问题描述】:
我在 Oracle 中有一张表:
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" ;
顺序:
CREATE SEQUENCE "ABCUSER"."MY_SEQUENCE" MINVALUE 1 MAXVALUE 9999999999999999999999999999 增量 1 START WITH 10186338807 缓存 100 NOORDER NOCYCLE ;
【问题讨论】:
-
@MikeNakis - 完成
-
pOrinG 的答案会起作用,但我认为它不会产生任何巨大的性能优势,因为序列是高度优化的。如果序列是瓶颈,则很容易将序列的
CACHE子句从100更改为1000或10000,以将其性能提高几个数量级。我认为您还应该定义“很长时间”的含义,因为即使在最佳情况下,700 万条记录也需要一些时间来更新。 -
Oracle 的哪个版本?
标签: sql oracle performance