在PostgreSQL 官方论坛的邮件中, 一些用户将work_mem设置为 512MB 或者更大而引起OOM问题。简单的说就是你运行的复杂查询不要引起 OOM 问题. 简单的说, 最好能为每一个 session 的查询设置自己的 work_mem.最好在 postgresql.conf 的值设置的很低 (1-10MB), 然后根据 那些查询会使用的 work_mem 超过设置的...
再次执行该查询计划后,结果以shared hit的形式展现,hit就是读取shared_buffers的。 1.2 work_mem work_mem是PostgreSQL在写入临时磁盘文件之前,进行内部sort(order by)和hash(join)操作需要使用的内存量。work_mem需要通过explain analyze分析语句来确定合适的值。 例子:先设置work_mem为1MB。 SETwork_mem='1MB'; 1...
在postgresql中,work_mem不足(包括物化、hashjoin、某些table函数如generate_series)时写临时文件的实现在src/backend/utils/sort/tuplestore.c(它本质上是 tuplesort.c (logtape.c协助其实现multiple merge支持)的简化版本,src/backend/utils/sort/sharedtuplestore.c其实parallel-aware版本)中。 创建临时文件并写入元...
work_mem 定义针对 ORDER BY 和 DISTINCT 操作对元组进行排序所需的内存。 此参数确定了可用于内部排序操作和哈希表的内存量。 如果拥有大量可用内存,并且工作负载包含带复杂排序的查询,则增加此参数值可能会通过在溢出到磁盘之前允许进行更大型的内存中扫描来提高性能。
本地内存区主要包括工作内存(work_mem)、维护工作内存(maintenance_work_mem)以及临时缓冲(temp_buffers)。 工作内存用于查询处理过程中的数据排序(ORDER BY、DISTINCT)以及表之间的连接(Hash Join、Sort Merge Join)等操作。工作内存由参数 work_mem 进行配置,默认为 4 MB。 如果设置了合适的 work_mem,大部分的排...
maintenance_work_mem是用于VACUUM、CREATE INDEX等维护操作的内存。一般情况下,可以将其设置为总RAM的10%。 effective_cache_size告诉PostgreSQL的查询优化器,操作系统和PostgreSQL自身的缓存一共有多少内存可用。一般情况下,可以将其设置为总RAM的50%-75%。
通过上图我们可以看到,当sort的数据大于一万条时,explain显示排序方法从 quicksort in memory, 到external merge disk method,说明此时的work_mem的大小不能满足我们在内存的sort和hash表的需求。此时我们将work_mem参数的值调大 edbstore=#setwork_mem="500MB";SETedbstore=# EXPLAIN analyzeSELECT*FROMtestWHEREid...
work_mem 参数调优 work_mem:在pgsql 8.0之前叫做sort_mem。postgresql在执⾏排序操作时,会根据work_mem的⼤⼩决定是否将⼀个⼤的结果集拆分为⼏个⼩的和work_mem查不多⼤⼩的临时⽂件。显然拆分的结果是降低了排序的速度。因此增加work_mem有助于提⾼排序的速度。通常设置为实际RAM的2% -...
work_mem:执行器在执行ORDER BY和DISTINCT时使用该区域对元组做排序,以及存储归并连接和散列连接中的连接表。 maintenance_work_mem:某些类型的维护操作使用该区域(例如VACUUM、REINDEX)。 temp_buffers:临时表相关操作使用这部分内存。 共享内存区域由PostgreSQL服务器在启动时分配,由所有后端进程共同使用。这个区域也被划...
可以同时进行这样的操作。因此总的内存使用是work_mem的很多倍,在对 work_mem 做参数调整时, 要考虑上述事实。 排序操 做用于 ORDER BY, DISTINCT 和mergejoin。 散列表用于hash join, 基于散列的聚集操作, 基于散列的 IN 子查询。 进行这样的操作