我正在构建一个Java程序,该程序需要在计划SQL语句之前自动收集这些数据。该程序现在运行一个EXPLAIN
语句并解析结果。
我需要时间参数,因此我需要运行ANALYZE
,但是我不想影响任何数据,因此需要回滚。当我尝试按照PostgreSQL文档中的建议将所有这些作为一个块运行时,使用:
BEGIN;
EXPLAIN ANALYZE VERBOSE ...(statement)
ROLLBACK;
我没有得到EXPLAIN
语句的结果,而是得到了该查询块不影响任何行。
因此,我不确定获取此数据的最佳方法。我的想法也许是构建一个语句为text
参数的函数,该函数返回一个表,该表只是包含EXPLAIN
输出的1行/列,但是我并不是真正的PostgreSQL函数,所以更简单的选择是可取的。
不太确定如何执行此操作。任何帮助都会有帮助!
答案 0 :(得分:1)
当您说您正在“作为一个块”运行语句时,您可能意味着您正在java.sql.Statement.execute()
中运行三个语句。
然后,您只会看到最后一条语句的结果集,恰好是ROLLBACK
。
相反,您应该这样做:
conn.setAutocommit(false);
java.sql.Resultset rs = conn.createStatement().executeQuery("EXPLAIN ...");
// retrieve the EXPLAIN result
conn.rollback();