Вы должны попробовать вставить свои данные. С этой целью вы можете использовать OCI * ML . Обсуждение этого здесь . Заметная статья здесь . Или вы можете попробовать загрузить Oracle SQL Bulk Loader SQLLDR
, чтобы увеличить скорость загрузки. Для этого выполните сериализацию данных в файл csv и вызовите SQLLDR, передавая csv в качестве аргумента.
Еще одна возможная оптимизация - стратегия транзакций. Попробуйте вставить все данные в 1 транзакцию на поток / соединение.
Другой подход заключается в использовании MULTIPLE INSERT :
INSERT ALL
INTO ABC (SSM_ID, invocation_id , calc_id, analytic_id, analytic_value,
override, update_source ) VALUES ('c','b',NULL, 'test', 123 , 'N', 'asdf')
INTO ABC (SSM_ID, invocation_id , calc_id, analytic_id, analytic_value,
override, update_source ) VALUES ('a','b',NULL, 'test', 123 , 'N', 'asdf')
INTO ABC (SSM_ID, invocation_id , calc_id, analytic_id, analytic_value,
override, update_source ) VALUES ('b','b',NULL, 'test', 123 , 'N', 'asdf')
SELECT 1 FROM DUAL;
вместо insert .. union all
.
Ваши данные образца выглядят взаимозависимыми, что приводит к вставке 1 значительной строки, а затем ее добавлению в 4 строки с последующим sql-запросом.
Также отключите все индексы перед вставкой ( или удалить их и повторно создать навалом). Индекс таблиц уменьшает производительность вставки, пока вы фактически не используете его в это время (он вычисляет некоторый идентификатор по каждой вставленной строке и выполняет соответствующие операции).
Использование подготовленного синтаксиса оператора должно ускорить загрузку, так как сервер должен иметь уже проанализированный кешированный оператор.
Затем оптимизируйте свой код на C ++: переместите ops из цикла:
//! Preparing the Query
std::string insert_query = "insert into ";
insert_query += Context::instance().getUpdateTable();
insert_query += " (SSM_ID, invocation_id , calc_id,
analytic_id, analytic_value, override, update_source)\n";
while (startOffset < statements.size())
{ ... }