Какой самый быстрый способ вставки данных в таблицы Oracle?

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

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

insert into mytable values r_myRow;

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

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

являются ли эти методы целесообразными? Если да, то каков синтаксис?

8 ответов


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

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

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

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


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


Если падение индекса не ускоряет вещи достаточно, вам нужно Oracle SQL * Loader:

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


Предположим, вы взяли eid, ename,sal, job. Поэтому сначала создайте таблицу как:

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

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

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

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


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

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

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

Это не мешает вам использовать определенные подсказки (например,/добавить/).

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

спасибо,

Ролло


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

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

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

Stale stats-повторно проанализируйте статистику таблиц и индексов.

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

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

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

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