插入序列需要很长时间

时间:2017-07-01 09:55:18

标签: sql oracle performance

我在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;

3 个答案:

答案 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)

  1. 如果您使用的是Oracle RAC,则可能会出现问题。一个小的缓存序列会对性能产生影响。不使用命令,缓存来创建序列。

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

  3. 如果您可以将create table作为select来添加值,那么它将比更新快得多。

  4. 将table1重命名为table2; 创建表table1从table2中选择/ * + append * / *,[idvalue] id;