在 Postgres 中为特定查询设置 work_mem

use*_*467 4 java sql postgresql memory-management

我正在使用一个委托给 JDBC 驱动程序的库,PostgreSQL有些查询非常复杂,需要更多内存。我不想work_mem为所有查询设置大的东西,只是这个子集。问题是执行以下代码会导致错误:

// pseudo-code for what is happening
String sql = "set work_mem = 102400;";
sql += "SELECT * FROM expensive_query";

ResultSet rs = DatabaseDriver.execute(sql);
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到一个错误:

set work_mem = 102400;
Run Code Online (Sandbox Code Playgroud)

不返回任何结果。

这是有效的,pgAdmin因为您可以一次执行多个查询。有没有更好的方法来做到这一点,还是我需要执行任意 SQL 然后提取我想要的结果集?

a_h*_*ame 6

我不知道有什么DatabaseDriver作用,但是使用“普通”JDBC,您只需要执行以下操作:

Statment stmt = connection.createStatement();
stmt.execute("set work_mem = 102400");
ResultSet rs = stmt.executeQuery("select ...");
Run Code Online (Sandbox Code Playgroud)

  • ...然后`RESET work_mem;`。我还首先推荐`SET LOCAL work_mem`,这样如果你忘记`RESET`,它最多保持事务范围。 (6认同)