Что является более эффективным Oracle SQL?ПАРАЛЛЕЛЬНО СОЗДАТЬ ТАБЛИЦУ КАК ВЫБРАТЬ или ПАРАЛЛЕЛЬНО ВСТАВИТЬ? - PullRequest
3 голосов
/ 04 января 2012

Мне нужно сделать резервную копию таблиц и их данных в рамках тестирования программного обеспечения.Точные таблицы и содержащиеся в них данные могут различаться, поэтому я не могу жестко кодировать DDL или данные.Резервные таблицы будут иметь имена, аналогичные исходным таблицам, но с префиксом «QA_».Аналогично, но не идентично (за исключением префикса), только потому, что для обхода ограничения в 31 символ для имен таблиц мне необходимо сократить некоторые имена.

Какой самый быстрый способ сделать это?Использование объекта курсора и циклический просмотр таблиц для получения их DDL следующим образом:

select dbms_metadata.get_ddl(''TABLE'',' || '''' || cursor_rec.object_name || '''' || ') from dual

Использование этого DDL для создания резервных таблиц и последующее заполнение этих таблиц:делаем просто:

CREATE TABLE' || new_table_name 'PARALLEL AS SELECT * from ' || table_name || ''

Какой из двух методов быстрее?

Ответы [ 2 ]

4 голосов
/ 04 января 2012

Ну, и INSERT /*+ PARALLEL */, и CREATE TABLE .... PARALLEL AS SELECT ... собираются выполнить прямую загрузку.Таким образом, они в основном собираются использовать один и тот же путь кода для загрузки данных.

CTAS потребуется сначала выполнить DDL для создания таблицы, прежде чем продолжить загрузку.Но это небольшое количество постоянной работы.Чем больше копируемая таблица, тем меньше будет коэффициент.

Наконец, я просто упомяну, что вам следует изучить NOLOGGING для дальнейшего улучшения производительности.

В CTASВы можете просто добавить ключевое слово NOLOGGING после ключевого слова PARALLEL.Для INSERT /*+ PARALLEL */ вам нужно сначала выполнить ALTER TABLE ... NOLOGGING, чтобы включить его.

Обратите внимание, что вам нужно знать несколько вещей, если вы решите использовать NOLOGGING.Во-первых, only direct-load сделает nologging.Для таблиц это означает CTAS и INSERT с подсказкой PARALLEL или APPEND.

Во-вторых, рассмотрим последствия восстановления NOLOGGING.Когда таблица загружается с опцией NOLOGGING, данные NOT записываются в REDO.Таким образом, вы не сможете восстановить данные в таблице, если не используете резервную копию, взятую после данных, успешно загруженных и зафиксированных.

Надеюсь, это поможет.

0 голосов
/ 06 января 2012

Create-table-as , как правило, будет быстрее, так как он не включает много опций, таких как «первичные ключи, уникальные ключи, внешние ключи, проверочные ограничения, критерии разделения, индексы и значения по умолчанию для столбцов». ».

DBMS_METADATA по умолчанию будет включать большинство из этих объектов, что может значительно увеличить время, необходимое для копирования данных. (Хотя вы можете захотеть, чтобы эти объекты существовали для выбора, проверки и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...