Какой самый быстрый способ вставить данные в таблицу Oracle? - PullRequest
10 голосов
/ 27 сентября 2008

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

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

insert into mytable values r_myRow;

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

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

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

Ответы [ 8 ]

16 голосов
/ 27 сентября 2008

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

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

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

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

2 голосов
/ 27 сентября 2008

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

1 голос
/ 15 декабря 2012

Предположим, вы взяли 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');
1 голос
/ 27 сентября 2008

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

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

0 голосов
/ 04 февраля 2015

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

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

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

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

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

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

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

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

0 голосов
/ 19 марта 2009

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

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

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

Приветствия

Ролло

0 голосов
/ 27 сентября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...