Массовая вставка с использованием OCI

В настоящее время я вставляю записи по одной в таблицу из кода C++, используя OCI. Данные находятся в хэш-карте структур, я перебираю элементы карты, связывая атрибуты структуры со столбцами записи в таблице (например,

определить запрос вставки, используйте OCIBindByname() для всех столбцов записи, повторяющихся по карте, назначьте переменные связывания в качестве атрибутов конца структуры OCIStmtExecute

Это довольно медленно, поэтому я бы хотел ускорить выполнение массовой вставки. Какой хороший способ сделать это? Должен ли я использовать массив структуры для вставки всех записей в одном OCIStmtExecute? У вас есть пример кода, который показывает, как это сделать?

3 ответа

Вот пример кода, показывающий, как я реализовал это в OCI * ML. Таким образом, способ сделать это (скажем, для таблицы с одним столбцом целых чисел):

  1. malloc() блок памяти sizeof(int) × количество строк и заполнить его. Это может быть массив.
  2. Вызов OCIBindByPos() с этим указателем для *valuep и размер для value_sz,
  3. Вызов OCIStmtExecute() с iters установить количество строк с шага 1

По моему опыту, ускорения в 100 раз, безусловно, возможны.

bulk insert example.txt
by
{
delimeter=','  //  or any delimiter specified in your text files
size=200kb //or your size of text file
}

Что вы, вероятно, хотите сделать, это "массовые вставки". Массовая вставка в массив выполняется с помощью ArrayBinds, где вы связываете данные первой строки с первой структурой массива и устанавливаете переходы, которые обычно являются размером структуры. После этого вы можете просто выполнить оператор с количеством массивов. Многократное связывание создаст накладные расходы, поэтому используются массовые вставки.

Используйте DPL(прямая загрузка пути). Обратитесь к docs.oracle.com для получения дополнительной информации.

Другие вопросы по тегам