OCI预取不起作用

时间:2015-06-13 06:53:37

标签: c++ oracle oci prefetch lob

我们有一个使用OCI的应用程序,但我们似乎无法使预取工作。

我们在一个包含十几列的表上有一个select查询(其中包括一个CLOB列和一个MDSYS.GEOMETRY列)。 CLOB列在99%的情况下小于4000字节,甚至在50%的情况下为空。

流程如下:

  • 我们将OCI_ATTR_PREFETCH_ROWS设置为500
  • 我们将列绑定到输出缓冲区,CLOB直接绑定到8000字节的文本缓冲区
  • 对于CLOB句柄,我们将OCI_ATTR_LOBPREFETCH_SIZE设置为8000
  • 我们将OCISTMTEXECUTE与iters 1一起使用,因为一行被提取到缓冲区中。

现在,如果我们看看WireShark,我们会看到网络数据包永远不会被填充(每次往返只有一条记录)。

如果我们使用SQLDeveloper执行相同的select查询,那么数据包很好地填充,所以我们可以假设行预取应该有效。

我们在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

因为我最近遇到了同样的问题: OCI_ATTR_PREFETCH_ROWSOCI_ATTR_LOBPREFETCH_SIZE无法协同工作。

来自Oracle Docs:

  

如果LONG,LOB或Opaque Type列(例如XMLType)是查询的一部分,则预取无效。

每当结果集中有LOB时,就不能通过OCI_ATTR_PREFETCH_ROWS使用隐式预取,而是需要通过使用rowcount>调用OCIStmtFetch2()来使用显式行获取。 1。 那么当然你需要提前设置缓冲区,跟踪已经消耗的行,特别是需要调用OCIDefineArrayOfStruct()来通知oracle你的缓冲区布局。

相关问题