作为一款优秀的开源数据库软件,postgresql非常值得深入学习一下。先总结一下postgresql数据库的存储体系结构。
传统的关系型数据库的存储结构多采用表空间的管理方式,其中涉及到extent,segment,page,file等存储概念。
表空间的管理方式通常有SMS,DMS两种策略,postgresql在改进之后也支持了DMS方式。在oracle,db2中很早就支持了DMS了,在使用oracle的工作过程了对其有了全面了解。DMS不论在OLAP还是OLTP系统中都比SMS的性能有不小的提升,随着OLTP规模不断增大的情况下两者之间的差距显现不大。
在这里只总结一下postgresql的DMS管理方式。
数据文件
postgresql的文件管理方式与oracle的非常相似,每个数据文件的第一块存储文件头信息,第二个块存储文件头的6个文件位图页的日志情况,算起来是从第七个块真正的开始。postgresql的文件头中的位图页表示的是区(extent)的存储情况,而oracle表示的是块的分配情况;postgresql的每个区固定有16个块,oracle更灵活一些。
区
区的概念与oracle相同,连续的若干块组成了区,在postgresql中区中的块数是固定值16。
段
postgresql因为没有undo段,只存在数据段与索引段两种,实质只是段结构不同。postgresql的数据段与oracle相同,采用了自动段空间的管理方式:
1,每个段有一个段头页,也是段的第一个页;
2,每个段中每个区的第一页称为一级位图页;
3,每个段中第一区的第二个页称为二级位图页,其管理着512个一级位图页位置与得使用情况,每个段存在1016个二级位图页;
计算:
512个一级位图页/二级位图页*1016个二级位图页/段=520192个一级位图页。
每个区只有一个一级位图页,就是说每个段共有520192个区。
520192区/段*16块/区*8K/块=63.5GB
文件
文件的分配方式实际有表空间所采用的区分配方式决定。
分配新区:首先通过参数值used_size判断剩余空间是否足够16个块,初始化该区的一级位图页,修改二级位图页,更新段头页与文件头信息。
postgresql的存储策略大致如上,更深入的去学习其存储策略对数据库的维护与性能优化等方面都会带来更大的帮助。