在 Oracle 中将表移动到不同的模式

Hen*_*ing 5 oracle sql schema

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

CREATE TABLE newschema.mytable AS SELECT * from oldschema.mytable;
Run Code Online (Sandbox Code Playgroud)

我试图重命名表:

ALTER TABLE oldschema.mytable RENAME TO newschema.mytable;
Run Code Online (Sandbox Code Playgroud)

但似乎 Oracle 不允许这样做(我得到了一个 ORA-14047)。

我有哪些选择?exp/imp可能比“简单”副本快,但仍需要大量可用磁盘空间。

小智 4

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

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