使用 OCI 批量插入
我目前正在使用 OCI 从 C++ 代码将记录逐一插入到表中。数据位于结构的哈希图中,我迭代映射的元素,将结构的属性绑定到表中记录的列(例如
定义插入查询 对记录的所有列使用 OCIBindByname( ) 迭代地图 将绑定变量分配为结构体的属性 OCIStmt执行 这非常慢
,所以我想通过批量插入来加快速度。有什么好的方法可以做到这一点?我应该使用结构数组将所有记录插入一个 OCIStmtExecute 中吗?您有任何示例代码可以说明如何执行此操作吗?
I am currently inserting records one-by-one into a table from C++ code using OCI. The data is in a hashmap of structs, I iterate over the elements of the map, binding the attributes of the struct to the columns of a record in the table (e.g.
define insert query
use OCIBindByname( ) for all the columns of record
iterate over map
assign bind variables as attributes of the struct
OCIStmtExecute
end
This is pretty slow, so I'd like to speed up by doing a bulk insert. What is a good way to do this? Should I use an array of struct to insert all the records in one OCIStmtExecute? Do you have any example code which shows how to do this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这里是一些示例代码,展示了我如何在 OCI*ML。总之,执行此操作的方法是(例如,对于具有一列整数的表):
malloc()
一块sizeof(int)
× 数字的内存块行并填充它。这可能是一个数组。*valuep
的指针和value_sz
的大小调用OCIBindByPos()
。OCIStmtExecute()
并将iters
设置为步骤 1 中的行数在我的 经验,100倍的加速当然是可能的。
Here is some sample code showing how I implemented this in OCI*ML. In summary, the way to do this is (say for a table with one column of integers):
malloc()
a block of memory ofsizeof(int)
× the number of rows and populate it. This could be an array.OCIBindByPos()
with that pointer for*valuep
and the size forvalue_sz
.OCIStmtExecute()
withiters
set to the number of rows from step 1In my experience, speedups of 100× are certainly possible.
您可能想要做的是“批量插入”。数组中的批量插入是通过使用 ArrayBinds 完成的,其中将第一行的数据与数组的第一个结构绑定并设置跳转(通常是结构的大小)。之后,您可以使用数组数量执行语句。多次绑定会产生开销,因此使用批量插入。
What you probably want to do is 'bulk inserts'. Bulk inserts in array are done by using ArrayBinds where you bind the data of the first row with the first structure of the array and set jumps, which generally is size of structure. After this you can just do statement execute with number of arrays. Multiple binds will create overheads, hence bulk inserts are used.
使用DPL(直接路径加载)。
请参阅 docs.oracle.com 了解更多信息。
Use DPL(Direct Path Loading).
Refer to docs.oracle.com for more info.