我应该在重复查询中使用preparedStatement,其中where子句谓词更改经常导致所选计划的更改

时间:2014-07-26 16:44:15

标签: java eclipse postgresql jdbc

我有一个Java应用程序,它使用JDBC在PostgreSQL 9.3服务器上执行查询。在我的java应用程序中,我不得不多次(以千计)执行相同的查询,并在'其中'子句断言单独。我一直在使用Statement类。我最近在某处阅读了PreparedStatement类,我在想是否应该使用它来加速处理。但我怀疑的是这个。由于我的查询每次都使用Where子句谓词中的不同值执行,因此选择性将更改,因此数据库服务器选择的计划将更改。在那种情况下,会使用PreparedStatement加速处理吗? 是在创建Preparedstatement时选择了计划,还是仅在preparedstatement对象上调用execute 时选择了计划?如果在自己创建预备语句时选择了计划,那么它是如何完成的,因为优化程序根据使用实际谓词值计算的选择性选择计划。

我的查询是一个涉及许多表的复杂查询。模板就像, 从表中选择谓词1和谓词2以及价格< X和日期< Ÿ; 其中 X和Y因每个查询而异

2 个答案:

答案 0 :(得分:1)

来自PostgreSQL doc

  

PREPARE创建一个准备好的声明。准备好的声明是   可用于优化性能的服务器端对象。当。。。的时候   执行PREPARE语句,解析指定的语句,   分析并重写。随后执行EXECUTE命令   已发布,准备好的声明已计划并执行。这个师   劳动避免了重复的解析分析工作,同时允许   执行计划取决于提供的具体参数值。

moe是对的:准备一个查询只会消除一次又一次地重新解析它的开销。仅当您将使用其参数执行准备好的查询时才会执行规划。

答案 1 :(得分:0)

在9.3中,它使用启发式。它执行类似于使用特定绑定值计划查询的前5次执行预处理语句。如果这些计划都没有比通用计划好得多,那么就会停止个人计划,从那时起就开始使用通用计划。

但是还有另一个问题,因为你的代码告诉驱动程序使用预准备语句并不意味着驱动程序实际上是这样做的。很多司机都做了很奇怪的事情。

真正的答案是测试,测试,测试。