postgresql - 用户级别的 postgres work_mem
问题描述
如果使用以下语句在用户级别设置了 work_mem,假设这将应用于该用户运行的每个查询?
alter user user1 set work_mem='64MB';
- 如果一个函数是使用安全定义器执行的 - 它会使用 user1 的 work_mem 还是函数所有者的 work_mem 运行?
- 如果一个函数是使用安全调用程序执行的,并且 work_mem 设置为 1GB - 它会使用 user1 的 work_mem 还是函数中设置的 work_mem 运行?
- 如果 user1 正在执行多个会话,每个会话是获得自己的 64MB 内存还是使用在用户级别设置的一块 64MB 内存?
这里的想法是给某些用户更多的内存。
解决方案
如果使用 更改参数ALTER ROLE
,则在角色连接到数据库时设置该参数。
如果您稍后更改用户上下文,例如使用SET ROLE
或执行SECURITY DEFINER
函数,则参数不会更改。
如果使用 设置参数ALTER FUNCTION ... SET
,则在执行期间该参数设置为该值。这样的设置会暂时覆盖数据库会话启动时设置的值。
work_mem
不限制用户所有会话的内存量,也不限制单个后端可以使用多少内存。它限制了执行计划(排序、散列或位图)中单个步骤的可用内存量。如果单个查询执行计划包含多个需要内存的执行步骤,则此查询可以使用多次work_mem
。
我配置内存的经验法则是:
work_mem * max_connections + shared_buffers ≤ RAM
推荐阅读
- java - 如何使用 java 代码而不是 xml 代码将按钮添加到 android studio 中的另一个活动
- python - 使用 GradientTape 时,Tensorflow 渐变总是给出 None
- r - 如何将函数应用于 R 中小标题列表的每一行?
- python - 使用代理抓取循环一切
- javascript - Javascript 集:变得毫无意义?
- web - 将每个玩家请求路由到不同的服务器/IP 地址
- reactjs - 在 useEffect 或类似中使用指示 prop 的最佳实践
- javascript - 函数 .push 不断替换数组中与最后一个相同的所有元素
- java - 尝试在空对象引用上调用虚拟方法“void android.view.View.measure(int, int)”
- javascript - this.setState 没有更新