Java PreparedStatement非常慢,但手动查询很快

Java PreparedStatement非常慢,但手动查询很快,java,postgresql,jdbc,ofbiz,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) <=

我准备了一份来自以下框架的声明:

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
从public.ORDER\u标题OH,public.ORDER\u STATUS OS中选择OH.ORDER\u ID,MAX(OS.STATUS\u DATETIME),其中((OH.ORDER\u ID=OS.ORDER\u ID和OH.STATUS\u ID=?和OS.STATUS\u ID=?)按OH.ORDER分组_

如果结果集很大,则ID具有(MAX(OS.STATUS_DATETIME)-PreparedStatement可能工作得更慢,因为默认的“fetchSize”只有10。 尝试为此查询设置更大的fetchSize。 更多信息请点击此处:

这里特别针对Postgre:

准备好的语句在不知道实际参数的情况下进行优化。在PostgreSQL 9.1中,准备好的语句仅针对最常见的值进行优化。当准备好的语句速度较慢时,则必须使用动态SQL。PostgreSQL有很好的API-参数化查询-这是一些准备好的语句之间的查询语句和常规查询-它可以安全地防止SQL注入,并且不会出现盲优化问题。

如果使用preparedStatements,则必须识别参数类型。您可以解释SQL。 例如 uid类型是整数

解释分析选择*从用户那里输入uid(200500800);
编制fooplan(int,int,int)作为
挑选*
来自用户
其中uid为($1,$2,$3);
解释执行计划(200500800);
将fooplan1(数字、数字、数字)准备为
挑选*
来自用户
其中uid为($1,$2,$3);
解释执行食品计划1(200500800);

发布您的java代码。根据您的描述,问题出在java方面。此外,请确保您执行的查询完全相同(如DB方面的日志记录所示),而不是有细微差别的查询。这两个语句看起来非常不同。为什么第二个语句有内部联接?实际的查询速度很慢(它在数据库中运行,而不是在结果集处理中运行)。使用动态SQL是什么意思?@david-这是通过Postgres上的
EXECUTE
语句或Oracle上的
EXECUTE IMMEDIATE
执行的语句的通用名称。查询在上次-在运行时格式化,任何时间都可能不同-在运行时从字符串创建-动态查询
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