在 Oracle 中将表移动到不同的架构

在 Oracle 中将表移动到不同的架构

如何将表从一个架构移动到另一个架构?这是一个相当大的表,因此以下查询需要很长时间才能完成,并且需要大量磁盘空间:

CREATE TABLE newschema.mytable AS SELECT * from oldschema.mytable;

我尝试重命名该表:

ALTER TABLE oldschema.mytable RENAME TO newschema.mytable;

但似乎 Oracle 不允许这样做(我收到 ORA-14047)。

我有什么选择?exp/imp可能比“简单”复制​​更快,但仍然需要大量的可用磁盘空间。

答案1

如果有比 CREATE TABLE AS SELECT 更快的解决方案,我会感到震惊。导出和导入,无论您使用的是经典版本还是 DataPump 版本,都需要 Oracle 从磁盘读取整个表,并在新模式中将整个表写入磁盘,就像 CTAS 一样,但中间有一个步骤,即将数据写入转储文件并从转储文件中读取数据。您可以发挥创造力,尝试将导出实用程序的输出传送到导入实用程序,并让导出和导入同时运行,以避免将所有数据写入磁盘,但这样您只是在努力消除导致导出和导入本身变慢的部分 I/O。此外,并行化 CTAS 通常比尝试并行化导出和导入更容易。

另一方面,执行导出和导入的好处是您可以自动移动约束、索引和其他依赖对象。如果您执行 CTAS,则必须在填充数据后单独创建索引和约束。

答案2

导出 oldschema 上的架构,但设置 rows=n,这样就不会导出任何数据。使用 DDL 创建新表。然后select into反复使用,在不会对性能造成太大影响的情况下移动数据块。当所有数据都移动后,使用 DDL 创建索引。

答案3

假设你使用 10g 或更高版本,我会使用数据泵因为它的效率。这里有一个很好的,简明概述实用程序。没有简单的重命名操作来执行您想要的操作 - 您必须移动数据。我确实遇到过这种情况有趣的方法

答案4

他们在这里给出了答案:如何将表移动到另一个模式? 作者创建了一个范围分区表,然后创建了新表的布局。然后他: alter table t1_temp exchange participate dummy with table t1 including indexes without validation; alter table t1_temp exchange participate dummy with table kutrovsky.t1 including indexes without validation;

第一个命令将数据段“分配”到 t1_temp 表。第二个命令将数据段“分配”到新所有者中的 t1 表

它并不像在 SQL Server 中那么容易,你可以将 persons.Address 移动到 Humanresources,方法如下:ALTER SCHEMA HumanResources TRANSFER Person.Address;

相关内容