postgresql - 了解 Postgres work_mem、maintenance_work_mem 和 temp_buffers 分配
问题描述
我想了解一些postgresql.conf 参数的配置。我想知道何时分配maintenance_work_mem、work_mem 和temp_buffers。
据我了解,
- maintenance_work_memory 在服务器启动时分配,此内存不能被任何其他进程使用。
- work_mem 在查询解析时被分配,规划器检查排序方法或哈希表的数量并相应地分配内存。排序操作可能不会使用完全分配的内存,但仍为该特定操作保留,并且不能被任何其他进程使用。
- temp_buffers 在每个会话开始时分配。
我已经浏览了文档,但没有得到任何正确的答案。
这种理解正确吗?
解决方案
维护工作内存是为 VACUUM、CREATE INDEX 和 ADD FOREIGN KEYS 分配的每个会话,它也依赖于并行工作程序,例如 autovacuum_max_workers = 3 和 maintenance_work_mem = 1 GB,那么 autovacuum 在创建索引时同样会消耗 1*3= 3GB 的内存.
现在,work_mem 也会根据您的排序/散列操作在每个会话中分配,但是我确信 Postgres 不会保留将来使用的任何内容并进行调整,您应该在分配此内存之前始终考虑您的并行连接数此参数消耗每个连接在集群中运行的内存 work_mem*sort 操作。
是的,确实 temp_buffers 可以在单个会话中更改,但只能在会话中第一次使用临时表之前更改。
http://rhaas.blogspot.com/2019/01/how-much-maintenanceworkmem-do-i-need.html作者:罗伯特·哈斯 https://www.depesz.com/2011/07/03/understanding-postgresql- Deprez https://www.interdb.jp/pg/pgsql02.html和https://severalnines.com/database-blog/architecture-and-tuning-memory-postgresql-databases的conf-work_mem/非常有助于理解内存架构
推荐阅读
- reactjs - 错误是传播不可迭代实例的无效尝试。为了可迭代,非数组对象必须有一个 [Symbol.iterator]() 方法
- android - 如何更改TextInputLayout内edittext的边框颜色
- javascript - 如果时间少于所选时间,如何在议程周中更改颜色
- python - 在列表中搜索 - 是否有更有效的方法来编写此代码?
- javascript - IoT 设备上的 HTTPS 握手失败
- prometheus - 用普罗米修斯计算最大值
- node.js - NodeJS 中的图片上传
- ruby - jekyll 构建错误未知编码名称“chunked\r\n\r\n25”
- macos - 如何删除一直自行打开的mac应用
- python - 如何将系列合并为 DataFrame 多索引的一列的成员