Какой самый быстрый способ вставки данных в таблицы 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
- основные моменты, котор нужно рассматривать для вашего если бы добавить подсказку, как это непосредственно добавлять в таблицу вместо использования freelist. Если вы можете позволить себе отключить ведение журнала, чем использовать append с подсказкой nologging, чтобы сделать это
- используйте массовую вставку вместо итерации в PL/SQL
- используйте 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