Перемещение таблицы в другую схему в Oracle

Как переместить таблицу из одной схемы в другую? Это довольно большая таблица, поэтому выполнение следующего запроса займет много времени и потребует огромного дискового пространства:

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

Я попытался переименовать таблицу:

ALTER TABLE oldschema.mytable RENAME TO newschema.mytable;

но, похоже, Oracle этого не разрешает (я получаю ORA-14047).

Какие у меня варианты? exp/imp вероятно, быстрее, чем "простая" копия, но все равно потребуется много свободного дискового пространства.

4 ответа

Решение

Я был бы шокирован, если бы было более быстрое решение, чем CREATE TABLE AS SELECT. Для экспорта и импорта, используете ли вы классическую версию или версию DataPump, Oracle потребует прочитать всю таблицу с диска и записать всю таблицу на диск в новой схеме, точно так же, как CTAS, но с промежуточным шагом: запись данных в файл дампа и чтение его из файла дампа. Вы можете проявить творческий подход и попытаться передать выходные данные утилиты экспорта в утилиту импорта и одновременно запустить экспорт и импорт, чтобы потенциально избежать записи всех данных на диск, но тогда вы просто работаете над устранением части I/O, которые делают экспорт и импорт по своей сути более медленными. Кроме того, обычно проще распараллелить CTAS, чем пытаться распараллелить экспорт и импорт.

С другой стороны, преимущество экспорта и импорта заключается в том, что вы можете автоматически перемещать ограничения, индексы и другие зависимые объекты. Если вы используете CTAS, вам придется создавать индексы и ограничения отдельно после заполнения данных.

Предполагая, что вы используете 10 г или выше, я бы использовал Data Pump для его эффективности. Вот хороший, краткий обзор утилит. Нет простой операции переименования, чтобы сделать то, что вы хотите сделать - вам придется перемещать данные. Я сталкивался с этим интересным методом.

Экспортируйте схему на oldschema, но задайте row =n, чтобы данные не экспортировались. Используйте DDL для создания новой таблицы. Тогда используйте select into многократно перемещать порции данных, когда это не слишком сильно влияет на производительность. Когда все данные перемещены, используйте DDL для создания индексов.

Здесь они отвечают: как переместить таблицу в другую схему? автор создает таблицу с разбивкой по диапазонам, затем создает макет новой таблицы. Затем он: изменяет таблицу t1_temp, заменяет фиктивный раздел на таблицу t1, включая индексы без проверки; изменить таблицу t1_temp обмениваться фиктивным разделом с таблицей kutrovsky.t1, включая индексы без проверки;

Первая команда "назначает" сегмент данных в таблицу t1_temp. Вторая команда "назначает" сегмент данных таблице t1 у нового владельца

Это не так просто, как в SQL Server, где вы могли бы перемещать людей. Адресуйте в отдел кадров: ALTER SCHEMA HumanResources TRANSFER Person.Address;

Другие вопросы по тегам