首页 > 解决方案 > 用户级别的 postgres work_mem

问题描述

如果使用以下语句在用户级别设置了 work_mem,假设这将应用于该用户运行的每个查询?

alter user user1 set work_mem='64MB';
  1. 如果一个函数是使用安全定义器执行的 - 它会使用 user1 的 work_mem 还是函数所有者的 work_mem 运行?
  2. 如果一个函数是使用安全调用程序执行的,并且 work_mem 设置为 1GB - 它会使用 user1 的 work_mem 还是函数中设置的 work_mem 运行?
  3. 如果 user1 正在执行多个会话,每个会话是获得自己的 64MB 内存还是使用在用户级别设置的一块 64MB 内存?

这里的想法是给某些用户更多的内存。

标签: postgresql

解决方案


如果使用 更改参数ALTER ROLE则在角色连接到数据库时设置该参数。

如果您稍后更改用户上下文,例如使用SET ROLE或执行SECURITY DEFINER函数,则参数不会更改。

如果使用 设置参数ALTER FUNCTION ... SET,则在执行期间该参数设置为该值。这样的设置会暂时覆盖数据库会话启动时设置的值。

work_mem不限制用户所有会话的内存量,也不限制单个后端可以使用多少内存。它限制了执行计划(排序、散列或位图)中单个步骤的可用内存量。如果单个查询执行计划包含多个需要内存的执行步骤,则此查询可以使用多次work_mem

我配置内存的经验法则是:

work_mem * max_connections + shared_buffers ≤ RAM


推荐阅读