PreparedStatement 很慢,但是手动查询很快

Zso*_*nos 6 java postgresql jdbc ofbiz

我有一个来自框架的准备声明如下:

SELECT OH.ORDER_ID, MAX(OS.STATUS_DATETIME) FROM public.ORDER_HEADER OH, public.ORDER_STATUS OS WHERE ((OH.ORDER_ID = OS.ORDER_ID AND OH.STATUS_ID = ? AND OS.STATUS_ID = ?)) GROUP BY OH.ORDER_
ID HAVING (MAX(OS.STATUS_DATETIME) <= ?) ORDER BY OH.ORDER_ID ASC
Run Code Online (Sandbox Code Playgroud)

OrderHeader 有 300 000 行,OrderStatus 大约有 5-6 百万行。所有查询的字段都有一个索引。数据库是 Postgres 9.1

SELECT OH.ORDER_ID, MAX(OS.STATUS_DATETIME) FROM ORDER_HEADER OH INNER JOIN ORDER_STATUS OS 
    ON ((OH.ORDER_ID = OS.ORDER_ID AND OH.STATUS_ID = 'ORDER_PARTIALLY_RECEIVED' AND OS.STATUS_ID = 'ORDER_PARTIALLY_RECEIVED'))
     GROUP BY OH.ORDER_ID HAVING (MAX(OS.STATUS_DATETIME) <= '2015-01-27 00:00:00') ORDER BY OH.ORDER_ID ASC
Run Code Online (Sandbox Code Playgroud)

这是替换参数时的查询字符串。

从 Java 运行查询,作为 PreparedStatement 和其中设置的参数使查询运行几分钟(5-6 分钟)。当我手动运行 SQL 时,它需要 10 秒。这怎么可能,我该如何解释?

Str*_*koZ 2

如果结果集很大-PreparedStatement 可能会运行得更慢,因为默认的“fetchSize”只有 10。尝试为此查询设置更大的 fetchSize。更多信息在这里:http://docs.oracle.com/cd/A97335_02/apps.102/a83724/resltse5.htm
这里专门针对 Postgres: https: //jdbc.postgresql.org/documentation/head/query.html