Назад | Перейти на главную страницу

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

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

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

Пробовал переименовать таблицу:

ALTER TABLE oldschema.mytable RENAME TO newschema.mytable;

но, похоже, Oracle этого не допускает (я получаю ORA-14047).

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

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

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

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

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

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

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

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