pgsql 存储管理
内存管理
包括共享内存、本地内存、内存上下文、缓冲区的管理。
-
共享内存
共享内存中存储了所有进程的公共数据,例如锁变量、进程通信状态、共享缓冲区中的页面块等。
-
本地内存
为每个后台进程所专有,是他们的工作区域,存储着属于该进程的Cache(高速缓存)、事务管理信息、进程信息等
-
内存上下文
内存上下文(MemoryContext)用于统一管理内存分配和回收。
-
缓冲区
磁盘中的文件块读入内存,被存放在缓冲区中, 称之为页面块或缓冲块。一个标准缓冲块大小为8K。PG设立了共享缓冲池(SharedBufferPool)和本地缓冲池
共享内存机制
- 轻量级锁机制:用于防止多个进程并发访问共享内存中的数据发生冲突。
- 进程间通信(IPC)机制:在进程之间进行通信和消息传递,使用消息队列同步进程之间的无效信息,还提供了对共享内存的管理。
- 共享缓冲池(shared buffer)机制:存储在进程之间共享的页面块。
本地内存机制
- 本地缓冲池机制:存储进程私有的页面块
- Cache机制:将进程最近使用的一些系统数据缓存在其私有内存中,级别高于缓冲池
外存管理
包括表文件管理、可见空间(VM)管理、空闲空间(FSM)管理、虚拟文件描述符(VFD)管理以及大数据存储管理等
-
表文件管理
PostgreSQL中每个表都用一个文件(表文件)存储,并以OID命名。文件大小超出限制,自动拆分并在文件名尾部加上顺序号以标识。
-
可见空间(VM)管理和空闲空间(FSM)管理
-
虚拟文件描述符(VFD)管理
-
大数据存储管理
在PostgreSQL中,每个数据库有一个数据库id。以数据库id创建目录,目录下存放对应的表。每个表都用一个文件存储,表文件以表的OID命名。
对于大小超出1G的表数据文件,PG会自动将其切分为多个文件来存储,切分出的文件用OID.<顺序号>来命名。
后缀为_fsm和_vm这两个表文件的附属文件是空间空闲映射表文件和可见性映射表文件。
每个表文件由多个BLCKSZ字节大小的page组成,文件的写入是以page为最小单位。
在PostgreSQL中,每个page缺省大小为8K,可以在编译PostgreSQL时指定BLCKSZ的大小,对于IO性能较好的硬件,增加BLCKSZ的大小可以显著提升数据库性能。
每个page又可以包含多个tuple(在PG中将保存在磁盘中的块称为page,而将内存中的块称为buffer,行称为tuple,这些都是与数学概念相同的)。
在PostgreSQL中,表文件中的tuple之间不进行关联,这样的表文件称为堆文件,每个堆文件都是由多个page组成。
reference
1.https://www.jianshu.com/p/1ab0ed41caa2