在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
语句中使用其他选项的更多信息,请参阅文档: