如何确定选择查询的最佳提取大小

KKO*_*KKO 13 memory oracle jdbc fetch

在JDBC中,默认的提取大小是10,但是当我有一百万行时,我猜这不是最好的提取大小.我知道提取大小太低会降低性能,但是如果提取大小太高也会降低性能.

我怎样才能找到最佳尺寸?这是否会对数据库方面产生影响,是否会占用大量内存?

Jea*_*ene 12

如果您的行很大,请记住,您一次获取的所有行都必须存储在驱动程序内部缓冲区的Java堆中.在12c中,Oracle有VARCHAR(32k)列,如果你有50个并且它们已满,那么每行有1,600,000个字符.Java中的每个字符都是2个字节.因此每行最多可占用3.2MB.如果您要获取100乘100的行,那么您将需要320MB的堆来存储数据,而这只是一个Statement.因此,您应该仅为获取相当小的行(数据大小较小)的查询增加行预取大小.


Jus*_*ave 10

与(几乎)任何事情一样,找到特定参数的最佳大小的方法是使用不同的参数值来测试您尝试优化的工作负载.在这种情况下,您需要使用不同的提取大小设置运行代码,评估结果并选择最佳设置.

在绝大多数情况下,人们选择100或1000的提取大小,结果证明是一个合理的最佳设置.此时值之间的性能差异通常非常小 - 您可以预期运行之间的大多数性能差异是正常随机变化的结果,而不是由提取大小的变化引起的.如果您尝试在特定配置中获得特定工作负载的最后性能,那么您当然可以进行该分析.但对于大多数人来说,100或1000就足够了.


prz*_*tel 5

JDBC fetch size属性的默认值是特定于驱动程序的,对于Oracle驱动程序,它的默认值为10。

对于某些查询,访存大小应较大,而对于较小的则应较小。

我认为一个好主意是为整个项目设置一些全局获取大小,并为一些应该更大的单个查询覆盖它。

看这篇文章:

http://makejavafaster.blogspot.com/2015/06/jdbc-fetch-size-performance.html

其中描述了如何全局设置访存大小,以及如何使用不同的方法将其覆盖以供精心选择的查询使用:Hibernate,JPA,Spring jdbc模板或核心jdbc API。以及一些针对oracle数据库的简单基准测试

根据经验,您可以:

  • 将fetchsize设置为50-100作为全局设置
  • 将个别查询的fetchsize设置为100-500(甚至更多)