什么是最有效的方法来创建一个表的副本的数据和没有约束的Oracle



在Oracle中创建无约束(主键和外键)的表副本的最有效方法是什么?类似于下面的查询。

CREATE TABLE new_table
AS 
SELECT * FROM old_table;

如果我们需要在复制后手动删除约束是可以的,但是copy的创建应该是快速的。

请建议。

使用您现在使用的CREATE TABLE AS SELECT语句可能是最有效的方法。如果不是,那就很接近了。

它不创建约束(除了not null约束)或索引,因此您必须在操作完成后手动创建它们。

您可以使用parallel关键字指定该操作应该并行化,但我认为该功能仅在企业版中可用。例子:

create table new_table 
parallel
as
select * from old_table;

甚至可以通过在parallel关键字后面添加一个整数参数来指定要使用的线程数。但是,默认情况下,它根据服务器上可用的cpu进行并行化。

通过避免重做日志生成,也可以使操作更快。这是通过指定nologging关键字来完成的:

create table new_table 
parallel
nologging
as
select * from old_table;

但是,由于没有生成重做日志,因此该操作不可恢复。因此,如果要使用它,应该考虑在操作完成后立即备份数据库。我个人不会使用这个选项,除非额外的性能出于某种原因是至关重要的。

有关如何在create table as select语句中使用其他选项的更多信息,请参阅文档:

最新更新