我正在尝试为Oracle数据库开发用于数据管理的Scala微服务。我使用JDBC驱动程序连接到它。
阅读与.NET驱动程序相比有关JDBC驱动程序的性能问题的答案,我已经了解调整JDBC读取性能的更有效工具之一是通过方法{{设置提取大小。 1}}。
我尝试连接到Oracle数据库以获取真实业务案例的实际数据,并且DB返回了固定数量的记录,并且我已经测量了经过时间的指数行为。特别是,从数据库中获取10,000行而不设置获取大小会导致非常大的获取时间,但是指定大于1,000的获取大小会导致获得少量时间(1 s内大约100 ms)。 / p>
以下是关于此主题的问题:
我认为增加过多的获取大小会耗费大量资源,因此在实际获取之前是否还有一种粗略的方法来估计 ResultSet 的大小?我已经阅读了以下技术:
ResultSet.setFetchSize
但这意味着滚动整个ResultSet,我想知道是否有任何粗略准确的技术来评估计数;
我估计一个好的提取大小将是所选记录数的1/10,但是有一个文档规则试图自动估计最大数量的案例的正确提取大小
答案 0 :(得分:1)
除非应用程序和数据库之间存在网络瓶颈,否则请不要将获取大小设置得太大。获取大小越大,消耗的内存就越多。
根据我的经验,1024 - 2048大部分时间都会带来最佳表现。看到 https://docs.oracle.com/javase/tutorial/jdbc/basics/retrieving.html讨论了一些细节,但默认设置通常是最好的。
不要试图获得结果集中的总行数,这不是最佳做法。
最后,我想指出,基于成千上万的时间优化JVM和jit,在你用1000-2000设置它之后,瓶子似乎永远不会在JDBC的获取大小上发生,而是在SQL性能上,应用程序或资源限制等。