我的应用程序有大量的查询,我想获取其中一些查询的执行计划。大多数(如果不是全部)查询都有多个参数,我找不到如何在PostgreSQL中获取任何非平凡查询的执行计划。
实际情况要复杂得多,但这里有一个简单的代表性查询案例(仅有一个参数以简化问题):
Connection conn = DriverManager.getConnection("...", "...", "...");
PreparedStatement ps1 = conn.prepareStatement(
"prepare x as select * from documents where content = $1");
ps1.execute();
PreparedStatement ps2 = conn.prepareStatement(
"explain (format json) execute x (?)");
ps2.setString(1, "Very long content here..."); // Binds the parameter
ResultSet rs = ps2.executeQuery(); // Error here!
while (rs.next()) {
System.out.println(rs.getString(1));
}
当我运行这个程序时,会出现以下错误:
ERROR: 没有参数 $1 Position: 34
如果我 硬编码 参数(例如将 $1
替换为 'a'
),则一切正常并且我得到了一个执行计划。但是,如果我尝试使用 JDBC 参数,则无法工作。在我的用例中,硬编码参数并不现实,因为它可能是大量的参数或者无法正确呈现为字符串(例如浮点值)。
我还尝试使用 null
而不是 ?
,程序不会崩溃,但返回的执行计划是错误的;似乎它以某种方式绕过了逻辑并返回了与现实完全不同的结果。
我做错了什么?
ps1 = conn.prepareStatement( "select * from documents where content = ?");
- Adrian Klaverprepare
和它的占位符$1
在你的查询版本中。如果我正确理解文档,这个问题会被PreparedStatement
自动处理。