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

Java 我应该在重复查询中使用preparedStatement吗?在重复查询中,where子句谓词经常更改,从而导致所选计划的更改,java,eclipse,postgresql,jdbc,Java,Eclipse,Postgresql,Jdbc,我有一个Java应用程序,它使用JDBC在PostgreSQL 9.3服务器上执行查询。在我的java应用程序中,我必须使用“where”子句谓词中的不同参数多次(数千次)执行相同的查询。到目前为止,我一直在使用语句类。我最近在某个地方读到关于PreparedStatement类的文章,我想我应该用它来加速处理。但我怀疑这一点。由于每次执行我的查询时Where子句谓词中的值不同,因此选择性将发生变化,因此db服务器选择的计划将发生变化。在这种情况下,使用PreparedStatement会加快处

我有一个Java应用程序,它使用JDBC在PostgreSQL 9.3服务器上执行查询。在我的java应用程序中,我必须使用“where”子句谓词中的不同参数多次(数千次)执行相同的查询。到目前为止,我一直在使用语句类。我最近在某个地方读到关于PreparedStatement类的文章,我想我应该用它来加速处理。但我怀疑这一点。由于每次执行我的查询时Where子句谓词中的值不同,因此选择性将发生变化,因此db服务器选择的计划将发生变化。在这种情况下,使用PreparedStatement会加快处理速度吗是在创建Preparedstatement时选择计划,还是仅在Preparedstatement对象上调用execute时选择计划?若在preparedstatement本身创建时选择了plan,那个么由于优化器根据使用实际谓词值计算的选择性来选择计划,那个么它是如何完成的呢

我的查询是一个涉及许多表的复杂查询。模板就像, 从predicate1和predicate2以及price PREPARE创建一个prepared语句。事先准备好的声明就是 可用于优化性能的服务器端对象。当 执行PREPARE语句时,将解析指定的语句, 分析和重写。当随后执行命令时 发布时,计划并执行准备好的报表。本部 大量的劳动避免了重复的解析分析工作,同时允许 执行计划取决于提供的特定参数值


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

在9.3中,它使用启发式。它的作用类似于在执行准备好的语句的前5次使用特定的绑定值规划查询。如果这些计划中没有一个比通用计划好得多,那么它将停止单独的计划,并从那时起使用通用计划

但是,代码告诉驱动程序使用预先准备好的语句,这并不意味着驱动程序实际上正在这样做。很多司机做奇怪的事情


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

好的。但我想知道解析和重写能节省多少时间,因为我认为计划是一个耗时的步骤。如果每次执行PreparedStatement时都这样做,那么您认为在我的场景中切换到PreparedStatement有用吗。。。解决方案我认为:)