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