PostgreSQL的内存架构可以分为两部分:
- 本地内存区域 —— 由每个后端进程分配,供自己使用。
- 共享内存区域 —— 供PostgreSQL服务器的所有进程使用。
下面一小节简要介绍了这两部分架构。
图2.2 PostgreSQL的内存架构
2.2.1 本地内存区域
每个后端进程都会分配一块本地内存区域用于查询处理。该区域会分为几个子区域 —— 子区域的大小有的固定,有的可变。 表2.2列出了主要的子区域。 详细信息将在后续章节中介绍。
表2.2 本地内存区域
子区域 | 描述 | 参考 |
---|---|---|
work_mem |
执行器在执行ORDER BY 和DISTINCT 时使用该区域对元组做排序,以及存储归并连接和散列连接中的连接表。 |
第三章 |
maintenance_work_mem |
某些类型的维护操作使用该区域(例如VACUUM ,REINDEX )。 |
6.1 |
temp_buffers |
执行器使用此区域存储临时表。 |
2.2.2 共享内存区域
PostgreSQL服务器启动时会分配共享内存区域。该区域分为几个固定大小的子区域。 表2.3列出了主要的子区域。 详细信息将在后续章节中介绍。
表2.3 共享内存区域
子区域 | 描述 | 参考 |
---|---|---|
shared buffer pool |
PostgreSQL将表和索引中的页面从持久存储加载至此,并直接操作它们。 | 第八章 |
WAL buffer |
为确保服务故障不会导致任何数据丢失,PostgreSQL实现了WAL机制。 WAL数据(也称为XLOG记录)是PostgreSQL中的事务日志;WAL缓冲区是WAL数据在写入持久存储之前的缓冲区。 | 第九章 |
commit log |
提交日志(Commit Log, CLOG) 为并发控制(CC)机制保存了所需的所有事务状态(例如进行中,已提交,已中止等)。 | 5.4 |
除了上面这些,PostgreSQL还分配了这几个区域:
- 用于访问控制机制的子区域(例如信号量,轻量级锁,共享和排他锁等)。
- 各种后台进程使用的子区域,例如
checkpointer
和autovacuum
。 - 用于事务处理的子区域,例如保存点(save-point) 与 两阶段提交(2PC) 。
诸如此类。
下一节:查询处理是PostgreSQL中最为复杂的子系统。如PostgreSQL官方文档所述,PostgreSQL支持SQL2011标准中的大多数特性,查询处理子系统能够高效地处理这些SQL。本章概述了查询处理的流程,特别关注了查询优化的部分。