尝试通过回滚运行EXPLAIN ANALYZE

时间:2018-11-02 19:46:36

标签: jdbc greenplum

我正在构建一个Java程序,该程序需要在计划SQL语句之前自动收集这些数据。该程序现在运行一个EXPLAIN语句并解析结果。

我需要时间参数,因此我需要运行ANALYZE,但是我不想影响任何数据,因此需要回滚。当我尝试按照PostgreSQL文档中的建议将所有这些作为一个块运行时,使用:

BEGIN;
EXPLAIN ANALYZE VERBOSE ...(statement)
ROLLBACK;

我没有得到EXPLAIN语句的结果,而是得到了该查询块不影响任何行。

因此,我不确定获取此数据的最佳方法。我的想法也许是构建一个语句为text参数的函数,该函数返回一个表,该表只是包含EXPLAIN输出的1行/列,但是我并不是真正的PostgreSQL函数,所以更简单的选择是可取的。

不太确定如何执行此操作。任何帮助都会有帮助!

1 个答案:

答案 0 :(得分:1)

当您说您正在“作为一个块”运行语句时,您可能意味着您正在java.sql.Statement.execute()中运行三个语句。

然后,您只会看到最后一条语句的结果集,恰好是ROLLBACK

相反,您应该这样做:

conn.setAutocommit(false);
java.sql.Resultset rs = conn.createStatement().executeQuery("EXPLAIN ...");
// retrieve the EXPLAIN result
conn.rollback();