“truncate-create as select”而不是更新

时间:2014-08-06 10:12:24

标签: sql oracle plsql oracle-sqldeveloper plsqldeveloper

我有一个包含大数据的表,我想更新它。我有办法做到这一点。首先,复制原始表并截断它。之后,我将使用create作为表的副本中的select。所以我不会使用更新表达式。它更有效吗?

2 个答案:

答案 0 :(得分:1)

您的问题的答案实际上取决于更新影响的行数。显然,将100,000,000行复制到另一个表中以更新一行是无效的。要更新所有这些内容可能会有所帮助,因为插入通常比更新更快。

在走这条路之前,我想了解有多少行正在更新。如果不是很多,那么适当的索引可能会提高更新的性能。

然而,你的方法的逻辑并不完全正确。我倾向于这样做:

create table temp_copy as
    select . . .
    from bigtable . . .;

你的逻辑在select。然后,截断大表并重新插入:

truncate table bigtable;

insert into bigtable
    select *
    from temp_copy;

答案 1 :(得分:0)

Whhi截断了桌子? 我假设你的表没有约束(如果你不能做截断!)。 你更简单的命令重命名; 它将像其他方法一样谨慎。 你可以做那样的事情(我带你的代码):

您的代码:

truncate  table table1; 
insert into table1 select * from table1_copy

替换为:

drop table table1 ;
alter table table1_copy rename to table1;
recreate index of  table1