Я знаю, что другие упомянули об этом, и вы не хотите его слышать, но используйте SQL * Loader или внешние таблицы . Мое среднее время загрузки для таблиц примерно одинаковой ширины составляет 12,57 секунд для строк более 10 м. Эти утилиты были явно разработаны для быстрой загрузки данных в базу данных и очень хороши в этом. Это может привести к дополнительным штрафным санкциям в зависимости от формата входного файла, но есть довольно много вариантов, и мне редко приходилось менять файлы до загрузки.
Если вы не хотите этого делать это тогда вам не нужно обновлять свое оборудование; вам необходимо удалить все возможные препятствия для быстрой загрузки. Чтобы перечислить их, удалите:
При всем этом вы обязываете базу данных выполнять больше работы, и потому что вы делаете это транзакционно, вы не используете базу данных в полном объеме.
Загрузите данных в отдельную таблицу, скажем ABC_LOAD
. После того, как данные были полностью загружены, выполните инструкцию single INSERT в ABC.
insert into abc
select abc_seq.nextval, a.*
from abc_load a
Когда вы это сделаете (и даже если вы этого не сделаете) убедитесь, что кеш последовательности размер правильный; , чтобы указать :
Когда приложение обращается к последовательности в кеше последовательности, порядковые номера читаются быстро. Однако, если приложение обращается к последовательности, которая не находится в кеше, последовательность должна считываться с диска в кеш, прежде чем будут использоваться порядковые номера.
Если ваши приложения используют много последовательностей одновременно, кеш последовательности может быть недостаточно большим для хранения всех последовательностей. В этом случае доступ к номерам последовательностей может часто требовать чтения с диска. Для быстрого доступа ко всем последовательностям убедитесь, что в вашем кеше достаточно записей для хранения всех последовательностей, используемых одновременно вашими приложениями.
blockquote>Это означает, что если у вас есть 10 потоков, одновременно записывающих 500 записей, каждый из которых использует эта последовательность, то вам нужен размер кеша 5000. В документе ALTER SEQUENCE указано, как это изменить:
alter sequence abc_seq cache 5000
Если вы будете следовать моему предложению, я бы увеличил размер кеша примерно до 10,5 м.
Посмотрите на подсказку APPEND (см. также базу Oracle) ; это инструктирует Oracle использовать вставку прямого пути, которая добавляет данные непосредственно в конец таблицы, а не ищет место для ее размещения. Вы не сможете использовать это, если ваша таблица имеет индексы, но вы можете использовать ее в
ABC_LOAD
insert /*+ append */ into ABC (SSM_ID, invocation_id , calc_id, ... ) select 'c','b',NULL, 'test', 123 , 'N', 'asdf' from dual union all select 'a','b',NULL, 'test', 123 , 'N', 'asdf' from dual union all select 'b','b',NULL, 'test', 123 , 'N', 'asdf' from dual union all select 'c','g',NULL, 'test', 123 , 'N', 'asdf' from dual
Если вы используете подсказку APPEND; Я добавил TRUNCATE
ABC_LOAD
после того, как вы вставили вABC
, иначе эта таблица будет расти бесконечно. Это должно быть безопасным, так как вы закончите использовать таблицу к тому времени.Вы не указываете, какую версию или версию или Oracle вы используете. Существует несколько дополнительных трюков, которые вы можете использовать:
- Oracle 12c. Эта версия поддерживает столбцы идентификации ; вы можете полностью избавиться от этой последовательности.
CREATE TABLE ABC( seq_no NUMBER GENERATED AS IDENTITY (increment by 5000)
- Oracle 11g r2 Если вы сохраняете триггер; вы можете напрямую присвоить значение последовательности.
:new.seq_no := ABC_seq.nextval;
- Oracle Enterprise Edition Если вы используете Oracle Enterprise, вы можете ускорить INSERT с
ABC_LOAD
с помощью подсказки PARALLEL :Это может привести к собственные проблемы (слишком много параллельных процессов и т. д.), поэтому проверьте. Он может помочь для небольших вставных партий, но это менее вероятно, поскольку вы потеряете время, вычисляя, какой поток должен обрабатывать то, что.insert /*+ parallel */ into abc select abc_seq.nextval, a.* from abc_load a
tl; dr
Используйте утилиты, которые поставляются с базой данных.
Если вы не можете использовать их, то избавитесь от всего, что может замедлить вставку и сделать это навалом, потому что это то, что база данных хороша.