我们有一个使用OCI的应用程序,但我们似乎无法使预取工作。
我们在一个包含十几列的表上有一个select查询(其中包括一个CLOB列和一个MDSYS.GEOMETRY
列)。 CLOB列在99%的情况下小于4000字节,甚至在50%的情况下为空。
流程如下:
OCI_ATTR_PREFETCH_ROWS
设置为500 OCI_ATTR_LOBPREFETCH_SIZE
设置为8000 OCISTMTEXECUTE
与iters 1一起使用,因为一行被提取到缓冲区中。 现在,如果我们看看WireShark,我们会看到网络数据包永远不会被填充(每次往返只有一条记录)。
如果我们使用SQLDeveloper执行相同的select查询,那么数据包很好地填充,所以我们可以假设行预取应该有效。
我们在这里缺少什么?
答案 0 :(得分:0)
因为我最近遇到了同样的问题:
OCI_ATTR_PREFETCH_ROWS
和OCI_ATTR_LOBPREFETCH_SIZE
无法协同工作。
如果LONG,LOB或Opaque Type列(例如XMLType)是查询的一部分,则预取无效。
每当结果集中有LOB时,就不能通过OCI_ATTR_PREFETCH_ROWS使用隐式预取,而是需要通过使用rowcount>调用OCIStmtFetch2()来使用显式行获取。 1。 那么当然你需要提前设置缓冲区,跟踪已经消耗的行,特别是需要调用OCIDefineArrayOfStruct()来通知oracle你的缓冲区布局。