Массовая вставка с использованием OCI
В настоящее время я вставляю записи по одной в таблицу из кода C++, используя OCI. Данные находятся в хэш-карте структур, я перебираю элементы карты, связывая атрибуты структуры со столбцами записи в таблице (например,
определить запрос вставки, используйте OCIBindByname() для всех столбцов записи, повторяющихся по карте, назначьте переменные связывания в качестве атрибутов конца структуры OCIStmtExecute
Это довольно медленно, поэтому я бы хотел ускорить выполнение массовой вставки. Какой хороший способ сделать это? Должен ли я использовать массив структуры для вставки всех записей в одном OCIStmtExecute? У вас есть пример кода, который показывает, как это сделать?
3 ответа
Вот пример кода, показывающий, как я реализовал это в OCI * ML. Таким образом, способ сделать это (скажем, для таблицы с одним столбцом целых чисел):
malloc()
блок памятиsizeof(int)
× количество строк и заполнить его. Это может быть массив.- Вызов
OCIBindByPos()
с этим указателем для*valuep
и размер дляvalue_sz
, - Вызов
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 для получения дополнительной информации.