gpt4 book ai didi

java - 与在 pgadmin 中执行查询相比,使用 JDBC 执行 Postgresql 查询需要更多时间

转载 作者:行者123 更新时间:2023-11-29 12:57:23 25 4
gpt4 key购买 nike

我有一个存储过程,带有一个参数(Parameter)

让我们称之为x

当我运行时,

select * from x('myParameter')

它在 4 分钟内完成。

现在我尝试在 java 中执行相同的存储过程,如下所示:-

PreparedStatement statement = connection.prepareStatement("Select * from x('myParameter')");
org.postgresql.PGStatement pgstmt = (org.postgresql.PGStatement)statement;
pgstmt.setPrepareThreshold(1);
boolean usingServerPrepare = pgstmt.isUseServerPrepare();
System.out.println(usingServerPrepare);
statement.execute();

这大约需要 26 小时才能完成。

我最初尝试不使用 pgstmt.setPrepareThreshold(1);,即 prepareThreshold 的默认值。结果是一样的。

然后我尝试将“set enable_neSTLoop false”作为存储过程的第一行的java程序,它在4分钟内完成。

当我明确强制服务器端准备好的语句时,我无法理解为什么查询会更改执行计划。

我正在使用 Postgres 9.4 和 Java 8。我还使用 PGBouncer 进行连接池。

我的疑问是 - 为什么 JDBC 会影响执行计划(如果有的话)?有没有办法强制服务器端执行计划到我从 Java 程序触发的查询?

最佳答案

得到解决方案:-存储过程中使用了一个表,比如“tab1”。

当我们从 PGAdmin/SQL 窗口运行存储过程时,选项卡 1 已在数小时前创建/修改。

在自动运行中,使用java,在执行存储过程前几秒创建并加载/修改tab1。
在第一种情况下(从 PGAdmin/SQL 窗口运行存储过程)当我们在 PGAdmin 中运行存储过程时,tab1 上的自动分析已经完成,而在第二种情况下(自动运行using java) tab1 上的自动分析尚未启动或正在处理中,因为 tab1 刚刚被修改。
这导致 Postgres 在从 PGAdmin 运行查询时选择一个更好的计划,与我们使用 java 运行时相比。

总结 - 选择了不同的计划,因为在第二种情况下,当我们运行存储过程时自动分析没有完成,导致查询计划选择不佳。

关于java - 与在 pgadmin 中执行查询相比,使用 JDBC 执行 Postgresql 查询需要更多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39745783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com