我在Oracle中有一个表:
script language="Javascript" type="text/javascript
它有超过700万行。我想添加另一列作为唯一ID。因此,该表看起来像:
table1
record_id variable value
1 100 50
1 101 40
2 100 30
2 101 60
1 102 100
但是当我尝试使用以下方式更新它时:
更新table1 SET id = my_sequence.nextval;
这需要很长时间。有没有更快的方法来完成这项工作?
这是创建表查询:
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
序列:
创建序列“ABCUSER”。“MY_SEQUENCE”MINVALUE 1 MAXVALUE 9999999999999999999999999999从1开始增加10186338807 CACHE 100 NOORDER NOCYCLE;
答案 0 :(得分:3)
更新所有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 :(得分:0)
如果您希望序列以1 ... 2 ... 3 ...开始在病房中,那么您可以使用以下内容。
update table_name set unique_seq = rownum;
我在一张有6条记录的桌子上试过它,它运行正常。我不是100%确定这是否是理想的方式,但我认为它会比nextval更快。
如果由于某种原因你仍然想要你定义的序列,你可以更新oracle序列以从max(unique_seq)号开始。
答案 2 :(得分:0)
如果您使用的是Oracle RAC,则可能会出现问题。一个小的缓存序列会对性能产生影响。不使用命令,缓存来创建序列。
700万行并不是一个很大的数字。您可能想要在更新期间检查是否存在应用程序阻止问题。这是一份DBA工作。他们需要为您检查锁定。
如果您可以将create table作为select来添加值,那么它将比更新快得多。
将table1重命名为table2; 创建表table1从table2中选择/ * + append * / *,[idvalue] id;