如何将表格从一个模式移动到另一个模式? 这是一个相当大的表,所以下面的查询需要很长时间才能完成,需要大量的磁盘空间:
CREATE TABLE newschema.mytable AS SELECT * from oldschema.mytable;
我试图重命名表:
ALTER TABLE oldschema.mytable RENAME TO newschema.mytable;
但似乎甲骨文不允许(我得到一个ORA-14047)。
我有什么select? exp / imp可能比“简单”副本更快,但是仍然需要大量的可用磁盘空间。
如果有比CREATE TABLE AS SELECT更快的解决scheme,我会感到震惊。 无论您使用的是传统版本还是DataPump版本,导出和导入都要求Oracle从磁盘读取整个表格,并将整个表格写入新模式的磁盘,就像CTAS一样,但是临时步骤为将数据写入转储文件并从转储文件中读取。 您可以变得富有创造性,并尝试将导出实用程序的输出传输到导入实用程序,同时导出和导入同时运行,以避免将所有数据写入磁盘,但是您只是努力消除部分I / O使输出和input本质上变慢。 此外,并行化CTAS通常比试图并行导出和导出更容易。
另一方面,导出和导入的好处是可以自动移动约束条件,索引和其他相关对象。 如果你做了一个CTAS,你将不得不在数据填充之后分别创build索引和约束。
导出oldschema上的模式,但设置rows = n,以便不导出数据。 使用DDL创build新表。 然后重复使用select into来移动数据块,这样不会影响性能太多。 当所有数据移动时,使用DDL创build索引。
假设你使用10g或更高,我会使用数据泵来提高效率。 以下是对这些实用程序的简要概述 。 没有简单的重命名操作来做你想做的事 – 你将不得不移动数据。 我遇到了这个有趣的方法 。
在这里他们有一个答案: 如何将表移动到另一个模式? 作者创build一个范围分区表,然后创build新表的布局。 然后他:改变表t1_temp与表t1的交换分区dummy,包括没有validation的索引; alter table t1_temp与表kutrovsky.t1交换分区哑元,包括没有validation的索引;
第一个命令将数据段“分配”给t1_temp表。 第二个命令将数据段“分配”给新所有者中的t1表
它不像在SQL Server那样你可以移动persons.Address人力资源:ALTER SCHEMA HumanResources TRANSFER Person.Address;