Является ли прямая вставка хорошим способом выполнения массовых вставок в Oracle? - PullRequest
1 голос
/ 30 июля 2009

Мы пытаемся найти лучший способ обработки BULK INSERT с помощью Oracle (10gR2), и я обнаружил, что это может быть довольно сложный вопрос. Один метод, который я нашел, включает в себя использование подсказки оптимизатора Append:

INSERT /*+ Append*/
INTO some_table (a, b)
VALUES (1, 2)

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

ALTER INDEX some_index REBUILD

Это было бы проще, чем пытаться запустить SQL * Loader как внешний процесс или выполнить какой-либо pl / SQL. Это кажется слишком легким. Я что-то упускаю? Любые вещи, которые могут вернуться, чтобы укусить меня, если я воспользуюсь этим подходом?

1 Ответ

2 голосов
/ 30 июля 2009

Несколько заметок ...

  1. Невозможно добавить одну строку, поэтому APPEND действителен только с синтаксисом INSERT INTO ... SELECT FROM.
  2. Добавление - это добавление данных над верхней отметкой таблицы, в которой данные форматируются в полные блоки, которые затем записываются в таблицу и обходят механизм SQL
  3. Добавление в параллельном режиме требует, чтобы каждый поток параллельных запросов выделял по крайней мере один новый экстент для таблицы, в которую записываются новые блоки. Это может быть расточительно.
  4. Индексы не игнорируются, но их обслуживание игнорируется до тех пор, пока блоки не будут записаны в таблицу.

См. Документацию для получения более важной информации: http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/tables.htm#ADMIN01509

...