2008-09-27 4 views
7

Я пишу преобразование данных в PL/SQL, которое обрабатывает данные и загружает их в таблицу. Согласно PL/SQL Profiler, одной из самых медленных частей преобразования является фактическая вставка в целевую таблицу. Таблица имеет один индекс.Каков самый быстрый способ вставки данных в таблицу Oracle?

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

insert into mytable values r_myRow;

кажется, что я мог бы получить производительность, выполнив следующие действия:

  • отключить запись во время вставки
  • Включить сразу несколько записей

Эти методы рекомендуются? Если да, то какой синтаксис?

ответ

14

Это гораздо лучше вставить несколько сотен строк за раз, используя таблицы PL/SQL и FORALL для привязки к инструкции insert. Подробнее об этом см. here.

Также будьте осторожны с тем, как вы создаете таблицы PL/SQL. Если это вообще возможно, предпочтете вместо этого делать все ваши преобразования непосредственно в SQL с помощью «INSERT INTO t1 SELECT ...», так как операции «строка за строкой» в PL/SQL все равно будут медленнее, чем SQL.

В любом случае вы также можете использовать вставки прямого пути, используя INSERT /*+APPEND*/, который в основном обходит кеш-память БД и напрямую выделяет и записывает новые блоки в файлы данных. Это также может уменьшить количество ведения журнала, в зависимости от того, как вы его используете. Это также имеет некоторые последствия, поэтому сначала прочтите fine manual.

Наконец, если вы усекаете и перестраиваете таблицу, может оказаться целесообразным сначала отказаться (или отметить непригодность), а затем перестроить индексы.

0

Отбросьте индекс, затем вставьте строки, а затем заново создайте индекс.

+0

Использование объемной insetr Однако методология смягчит влияние наличия индекса. – 2008-09-27 17:17:08

0

Проверить ссылку http://www.dba-oracle.com/t_optimize_insert_sql_performance.htm

  1. рассмотреть основные аспекты вашего случае использовать Append подсказку как это непосредственно добавлять в таблицу вместо использования FreeList. Если вы можете позволить отключить ведение журнала, чем использовать append с подсказкой nologging, чтобы сделать это
  2. Используйте вместо этого массовую вставку вместо итерации в PL/SQL
  3. Используйте sqlloaded для загрузки данных непосредственно в таблицу, если вы получаете данные из файла
2

Регулярные вставки - это самый медленный способ получить данные в таблице и не предназначенные для объемных вставок. Следующая статья ссылается на множество различных методов для улучшения производительности: http://www.dba-oracle.com/oracle_tips_data_load.htm

+0

Эта ссылка полна ужасных советов. – 2015-02-04 17:47:31

1

Если падение индекса не ускорить достаточно, Вы нуждаетесь в Oracle SQL * Loader:

http://www.oracle.com/technology/products/database/utilities/htdocs/sql_loader_overview.html

+0

Вы можете использовать тот же механизм для оптимизации загрузки, который использует sql * loader, не прибегая к инструменту командной строки. – 2008-09-27 17:17:46

0

Возможно, один из ваших лучших вариантов - избежать как можно большего количества Oracle. Я сам сбился с толку, но очень часто процесс Java может превосходить многие утилиты Oracle, которые либо используют OCI (read: SQL Plus), либо занимают столько времени, чтобы получить право (читайте: SQL * Loader).

Это не мешает вам использовать конкретные подсказки (например,/ПРИЛОЖЕНИЕ /).

Я был приятно удивлен каждый раз, когда я обращался к такому решению.

Приветствия,

Ролло

1

Предположим, вы взяли Эйд, ENAME, Сэл, работа. Таким образом, создать таблицу первых, как:

SQL>create table tablename(eid number, ename varchar2(20),sal number,job char(10)); 

Теперь вставьте данные: -

SQL>insert into tablename values(&eid,'&ename',&sal,'&job'); 
0

Вот мои рекомендации по быстрой вставки.

Trigger - Отключить любые триггеры, связанные с таблицей. Включить после вставки.

Индекс - индекс падения и заново создайте его после завершения вложений.

Stale stats - пересмотреть таблицу и статистику индекса.

Индекс де-фрагментации - при необходимости перестроить индекс Использовать без ведения журнала - использовать с помощью INSERT APPEND (только для Oracle). Такой подход очень рискованный подход, никаких журналов повторения не генерируется, поэтому вы не можете выполнить откат - сделайте резервную копию таблицы перед запуском и не пытайтесь использовать живые таблицы. Проверьте, есть ли у вашего db аналогичная опция

Параллельная вставка: Запуск параллельной вставки ускорит работу.

Использование Bulk Вставка Ограничения - Не так много накладных расходов во время вставки, но все еще хорошая идея, чтобы проверить, если он по-прежнему медленно после даже после шага 1

Вы можете узнать больше о http://www.dbarepublic.com/2014/04/slow-insert.html

Смежные вопросы