将行提取的 Oracle 大小设置得更高会使我的应用变慢?

2022-09-01 11:44:05

如此所述并在此处确认,通过 JDBC 查询数据时,Oracle 返回的默认行数为 10。我正在开发一个应用程序,该应用程序必须从我们的数据库中读取和比较大量数据。我认为,如果我们只是增加到1000左右,那么我们的应用程序肯定会表现得更快。事实证明,它的表现更慢,大约20%。defaultRowPrefetch

然后,我们决定将数字从10慢慢增加,看看它的表现如何。通过将它设置在100到200之间,我们已经看到大约增加了10%。但是,我从未想过,将其设置得更高会使我们的应用程序运行得更慢。任何想法为什么会发生这种情况?

谢谢!

编辑:

只是为了澄清,我使用的是Oracle 11g R2和Java 6。

编辑2:

好吧,我想重申我的问题,因为从下面的答案来看,我没有正确地表达自己:

如果我设置了较高的抓取大小,我的应用的性能怎么可能变慢?对我来说,这听起来像是在说“我们给你一个更快的互联网连接,即一个更胖的管道,但你的网页浏览会更慢。

在所有其他条件相同的情况下,正如我们在测试中所做的那样,我们非常好奇只有这一个更改,我们的应用程序如何表现得更糟。


答案 1

可能的解释:

  1. Java什么都不做,而Oracle正在计算前1000行而不是前10行。

  2. Oracle什么都不做,而Java正在计算最后1000行而不是最后10行。

  3. 通信协议(例如TCP / IP)等待很多,然后必须一次处理更多数据,但峰值数据传输将受到硬件限制的限制。这可以通过协议的开销来抵消,因此应该有最佳的提取大小,任何小于或更多的东西都会变慢;))

  4. 如果获取过程与其他Java代码同步,情况会变得更糟,因此Java仅在处理以前的数据后才要求更多行,而Oracle在此期间不执行任何操作。

    想象一下有3个人:

    • 第一张将A4纸对折
    • 第二个将一堆折叠的纸张从一个房间带到另一个房间
    • 第三次从折叠的纸上切下一些形状。

    如果第一个必须等到第2个堆栈返回,第2个堆栈必须等到第3个堆栈完成其工作,那么堆栈应该有多大?

    1000的堆栈不会比10的堆栈更好,我猜;))


答案 2

与所有事情一样,没有设置。虽然 JDBC 默认提取大小 10 并不适合您的情况,但对于“典型”OLTP 应用程序来说,这是可以的,而且对于您的情况来说,这似乎也不是那么糟糕。显然,大的提取大小也不适合您的情况。但同样,一次做1000个并不是那么糟糕。FAST=TRUE

您没有提到的另一个因素是正在拉动的行的宽度。假设您正在通过网络从数据库服务器拉取到应用服务器的数据块是 。如果您的行跨度为 5000 字节,并且您一次拉取 1000 个字节,则每次读取将带来 5 MB 的数据。在另一种情况下,也许您的行是“瘦”的,只有100个字节。然后,获取其中的1000个只能穿梭100K个碎片。sum(WIDTH*ROWS)

因为只有 YOU 才能知道返回的数据会是什么样子,所以建议为“常规”情况设置系统范围的提取大小,然后根据需要单独调整奇怪的查询。

总的来说,我也发现100是大数据进程的更好设置。这不是一个建议,而是传达一个观察结果。


推荐