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

StackOverflow https://stackoverflow.com/questions/143872

  •  02-07-2019
  •  | 
  •  

Вопрос

Я пишу преобразование данных в 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

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

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

Это также не мешает вам использовать конкретные подсказки (например /ДОБАВИТЬ/).

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

Ваше здоровье,

Ролло

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

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

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

Устаревшая статистика - Повторно проанализируйте статистику таблиц и индексов.

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

Параллельная вставка:Запуск parallel insert ускорит выполнение задания.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top