概述
我们在使用PostgreSQL的时候,可能会碰到表膨胀的问题(关于表膨胀可以参考之前的月报),即表的数据量并不大,但是占用的磁盘空间比较大,查询比较慢。为什么PostgreSQL有可能发生表膨胀呢?这是因为PostgreSQL引入了MVCC机制来保证事务的隔离性,实现数据库的隔离级别。
PostgreSQL的特色之一是它的并发控制机制,在维护一致性和完整性的同时,尽量避免读写的堵塞。MVCC通过避开传统数据库的LOCK机制,最大限度的减少锁竞争以允许合理的多用户环境中的性能。
PostgreSQL存储结构
PostgreSQL中,一个表对应一个逻辑文件,一个表被分割成若干个物理段文件(relation segment),除最后一段外默认大小40M。
文件页(磁盘块)是物理段文件的基本储存单位,也是内存和磁盘交换的单位。文件页大小限制了表元组的大小并影响磁盘操作效率,缺省大小8192字节,最大可设置为2^15字节(这是由磁盘块索引是15位决定的)。
一个文件页空间被逻辑分割为三个部分:
- PageHeader:页描述区
- 记载页的使用情况, 如页分布格式版本,元组数据空间和特殊空间的起始位置以及文件页相关的事务日志记载点等信息
- Tuple Item space:元组数据空间
- 实际记录元组数据的地方
- Special space:特殊空间
每个记录的元组(Tuple)称为一项,每项由描述ID和元组数据构成。
项描述ID描述了元组存储位置,大小以及一些状态标识。</