【问题标题】:Addition of Columns with default value in oracle having billions of record在具有数十亿条记录的 oracle 中添加具有默认值的列
【发布时间】:2013-06-06 09:18:39
【问题描述】:

我需要在 Oracle 11g 中有 17 亿条记录的表中添加 3 个具有默认值的列。用最少的时间完成这项工作的最佳选择是什么?

【问题讨论】:

  • 您可能已经解决了这个问题,但是新列是否定义为not null
  • 是的,已经解决了。不,它也允许空值。

标签: performance oracle oracle11g ddl alter-table


【解决方案1】:

添加列值时无法提高性能。如果您只选择行的子集,那么您可以尝试在那里进行优化。

如果列确实具有DEFAULT 值,那么当您INSERT 并且(a)不在列列表中命名列或(b)指定其值时,该值实际上将由Oracle 放在那里如DEFAULT:

CREATE TABLE MyTable (
  Col1 NUMBER(5) DEFAULT 10 NOT NULL,
  Col2 NUMBER(5) DEFAULT 20 NOT NULL,
  Col3 NUMBER(5) DEFAULT 30 NOT NULL
);

INSERT INTO MyTable VALUES (DEFAULT, DEFAULT, DEFAULT);
INSERT INTO MyTable (Col2, Col3) VALUES (21, 31);
INSERT INTO MyTable (Col2, Col3) VALUES (22, DEFAULT);
INSERT INTO MyTable (Col1) VALUES (11);

SELECT * FROM MyTable;

 COL1  COL2  COL3
----- ----- -----
   10    20    30  <-- VALUES (DEFAULT, DEFAULT, DEFAULT)
   10    21    31  <-- (Col2, Col3) VALUES (21, 31); Col1 defaults because not named
   10    22    30  <-- (Col2, Col3) VALUES (22, DEFAULT); Col1 defaults because not named
   11    20    30  <-- (Col1) VALUES (11); Col2 and Col3 default because not named

因此,如果您担心的是NULL,则无需检查:

SELECT Col1, Col2, Col3, Col1+Col2+Col3 AS TotCols
FROM MyTable;

      COL1       COL2       COL3    TOTCOLS
---------- ---------- ---------- ----------
        10         20         30         60
        10         21         31         62
        10         22         30         62
        11         20         30         61

如果您的问题是关于如何优化行子集,请添加更多信息。

【讨论】:

  • 基本上,我需要添加具有默认值的新列,以便现有行也将使用新列中的默认值进行更新。在这里,我们可以添加默认的空列,然后运行脚本来更新列的值,然后修改列的默认值,但是由于它有 17 亿条记录,这需要太多时间,或者我们可以直接添加具有默认值的列,但这会更新大量记录也需要花费太多时间。
  • @user1017936,如果您在添加列时指定DEFAULT,则不需要更新所有行。
  • 1 千万 = 10000000。是的,我知道,但它也会在这段时间内锁定表,并且对于如此大量的记录,停机时间会很长。所以,我一直在寻找其他选择。
猜你喜欢
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多