【问题标题】:Difference between Array fetch and Prefetch in OCIOCI 中 Array fetch 和 Prefetch 的区别
【发布时间】:2018-06-16 15:44:43
【问题描述】:

有一种说法是“Prefetch 是 8i 的一项新功能,客户端将自动为您获取数组——您不必再进行数组获取,它会发生。”来自https://asktom.oracle.com/pls/apex/asktom.search?tag=prefetch,似乎预取是数组提取的替代品。在 OCCI api(OCI C++ 版本)中,它具有用于数组提取的 SetDataBuffer 和用于预取的 setPrefetchRowCount,请参阅https://docs.oracle.com/database/121/LNCPP/reference027.htm#LNCPP1019。好像可以一起用。但是在我的性能测试中,我没有看到通过在特定数组大小(批量大小)下增加 prefetchCount 来提高性能。那么array fetch和prefetch有什么区别,如何配置prefetchCount来提高性能呢?

【问题讨论】:

  • 您总共选择了多少行数据以及您的预取行数是多少(从内存中我认为 Oracle 中的默认值是 100(OCCI 可能不同)?另外,数据库/操作系统/等可能已经在缓存您选择的数据?
  • 我正在加载 1GB 的 TPC-H 数据,总共 6990506 行。而且我正在尝试将 BatchSize 设置为 10000,而 PrefetchCount 从 0 到 10000 没有显示任何差异。
  • 这两个值都用于调整数据获取,而不是用于将数据加载到 Oracle DB 中。
  • 是的。我正在从 Oracle DB 中读取数据。

标签: oracle oracle-call-interface prefetch


【解决方案1】:

什么数据类型?当查询包含 LONG 或 LOB 列时,Oracle 数据库在内部禁用预取。

如果您同时使用预取和数组提取,一般建议是在执行时启用预取(因此应用程序和数据库之间的往返执行操作也会带回数据,从而减少整体往返),然后交换到数组获取。

对于通用 ODPI-C 库,我们默认使用 prefetch of 2array fetch size of 100。对于您自己的应用程序,您可能会发现不同的值效果更好。有诸如内存分配和重新分配成本等因素在起作用。

【讨论】:

  • 我还是不太明白。增加数组大小也应该能够减少往返。那我们为什么需要预取呢?
  • 我使用标准 TPC-H 数据,不包含 LONG 或 LOB 列。
猜你喜欢
  • 1970-01-01
  • 2019-04-15
  • 2020-10-09
  • 2017-10-16
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 2018-08-30
  • 2017-03-12
相关资源
最近更新 更多