暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 使用列值的更改从select创建表

ASKTOM 2019-10-10
363

问题描述

你好,

在工作中,我们有一个更新脚本,大约需要20个小时,一些最苛刻的查询是我们更改一些值的更新,例如:

UPDATE table1 SET
    column1 = DECODE(table1.column1,null,null,'no info','no info','default value'),
    column2 = DECODE(table1.column2,null,null,'no info','no info','another default value'),
    column3 = 'default value';
复制

像这样,我们有很多更新。问题是这些表有大约1000万行。我们也有一些更新,其中一些列将有一个默认值,但它们是可空的 (我知道如果他们有not null和默认约束,那么这样的列的添加几乎是立即的,因为值是在目录中),然后更新或添加此类列会花费大量时间。

我的方法是重新创建表 (正如汤姆在https://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:6407993912330)。但我不知道如何从原始表中retrive一些列,这些列将保持不变,还有其他将更改为默认值 (在更新之前,这样的列有一个明智的信息),这是因为我们需要保留一些信息私有。

所以,我的方法是这样的:

CREATE TABLE table1_tmp PARALLEL NOLOGGING
    AS (select col1,col2,col3,col4 from table1);

ALTER TABLE table1_tmp ADD ( col5 VARCHAR(10) default('some info') NOT NULL;
ALTER TABLE table1_tmp ADD ( col6 VARCHAR(10) default('some info') NOT NULL;

ALTER TABLE table1_tmp ADD ( col7 VARCHAR(10);
ALTER TABLE table1_tmp ADD ( col8 VARCHAR(10);
MERGE INTO table1_tmp tt
    USING table1 t
    ON (t.col1 = tt.col1)
WHEN MATCHED THEN
    UPDATE SET
        tt.col7 = 'some defaul value that may be null',
        tt.col7 = 'some value that may be null';

复制


希望对如何提高此类产品的性能有一个想法。
提前谢谢!


专家解答

所以你要复制表格并添加一堆列?

只需在select子句中添加表达式即可。如果需要,您可以在此处执行解码/大小写表达式。

您可以在新表的列列表中定义默认值和非null约束。

如果任何新列将为null,则只需选择null:

CREATE TABLE table1_tmp (
  col1,col2,col3,col4,
  col5 default 'some info' not null, 
  col6 default 'some info' not null,
  col7,col8
)
AS 
  select col1,col2,col3,col4, 
         'some info' col5, 'some info' col6,
         'some defaul value that may be null' col7,
         null col8
  from table1;
复制

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论