Какой самый быстрый способ вставить данные в таблицу Oracle?
Вопрос
Я пишу преобразование данных в PL / SQL, которое обрабатывает данные и загружает их в таблицу.Согласно профилировщику PL / SQL, одной из самых медленных частей преобразования является фактическая вставка в целевую таблицу.Таблица имеет один индекс.
Чтобы подготовить данные к загрузке, я заполняю переменную, используя rowtype таблицы, затем вставляю ее в таблицу следующим образом:
insert into mytable values r_myRow;
Кажется, что я мог бы повысить производительность, выполнив следующее:
- Отключите вход в систему во время вставки
- Вставка нескольких записей одновременно
Целесообразны ли эти методы?Если да, то каков синтаксис?
Решение
Гораздо лучше вставлять несколько сотен строк одновременно, используя таблицы PL / SQL и FORALL для привязки к инструкции insert.Подробнее об этом см. здесь.
Также будьте осторожны с тем, как вы создаете таблицы PL / SQL.Если это вообще возможно, предпочитайте вместо этого выполнять все свои преобразования непосредственно в SQL, используя "ВСТАВИТЬ В t1 SELECT ...", поскольку выполнение построчных операций в PL / SQL все равно будет медленнее, чем SQL.
В любом случае, вы также можете использовать вставки с прямым путем, используя INSERT /*+APPEND*/
, который в основном обходит кэш базы данных и напрямую выделяет и записывает новые блоки в файлы данных.Это также может сократить объем ведения журнала, в зависимости от того, как вы его используете.Это также имеет некоторые последствия, поэтому, пожалуйста, прочтите прекрасное руководство Первый.
Наконец, если вы усекаете и перестраиваете таблицу заново, возможно, имеет смысл сначала удалить (или пометить непригодными для использования), а затем перестроить индексы.
Другие советы
Обычные инструкции insert являются самым медленным способом получения данных в таблице и не предназначены для массовых вставок.В следующей статье упоминается множество различных методов повышения производительности: http://www.dba-oracle.com/oracle_tips_data_load.htm
Если удаление индекса недостаточно ускоряет процесс, вам понадобится Загрузчик Oracle SQL*:
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
- основные моменты, которые следует учитывать в вашем случае используйте подсказку Append, поскольку это будет добавлено непосредственно в таблицу вместо использования freelist.Если вы можете позволить себе отключить ведение журнала, используйте для этого append с подсказкой nologging
- Используйте вместо этого массовую вставку вместо итерации в PL / SQL
- Используйте sqlloaded для загрузки данных непосредственно в таблицу, если вы получаете данные из файловой ленты
Возможно, один из ваших лучших вариантов - избегать Oracle, насколько это возможно на самом деле.Я сам был сбит с толку этим, но очень часто процесс Java может превзойти многие утилиты Oracle, которые либо используют OCI (читать:SQL Plus) или займет у вас так много времени, чтобы разобраться (читать:SQL*Загрузчик).
Это также не мешает вам использовать конкретные подсказки (например /ДОБАВИТЬ/).
Я был приятно удивлен каждый раз, когда обращался к подобному решению.
Ваше здоровье,
Ролло
Вот мои рекомендации по быстрой вставке.
Триггер - отключает все триггеры, связанные с таблицей.Включите после завершения вставок.
Index - Удалите индекс и заново создайте его после завершения вставки.
Устаревшая статистика - Повторно проанализируйте статистику таблиц и индексов.
Удаление фрагментации индекса - при необходимости перестройте индекс Не используйте ведение журнала -Вставьте с помощью INSERT APPEND (только для Oracle).Этот подход очень рискованный, журналы повторов не генерируются, поэтому вы не можете выполнить откат - сделайте резервную копию таблицы перед запуском и не пробуйте работать с живыми таблицами.Проверьте, есть ли в вашей базе данных аналогичная опция
Параллельная вставка:Запуск parallel insert ускорит выполнение задания.
Используйте массовую вставку Ограничения - небольшие накладные расходы при вставке, но все же неплохо проверить, работает ли она по-прежнему медленно даже после шага 1
Вы можете узнать больше на http://www.dbarepublic.com/2014/04/slow-insert.html