GaussDB(DWS)存储系列之行存表
GaussDB(DWS)实时数仓的数据都是存储在非易失性的存储设备上,本文从行存表的存储结构出发,帮助大家更好的了解GaussDB(DWS)是怎么在物理磁盘上存储数据的。
行存表的数据文(表、索引、cudesc表等文件),被划分为多个固定大小的page页面(block),每个page页面默认大小为8K,页面编号(block number)从0开始计数。如果当前page页面已经存满,则在末尾会新增一个page,继续存储。
行存表的page页面主要由page header(页头)、空闲空间、数据heap tuple组成,下图展示了page页头各个字段的存储信息:
pd_lsn:本页面最后一次变更所写入的xlog记录对应的lsn。
pd_checksum:主要用于校验页面的完整性,避免数据由于磁盘、IO等原因导致异常。
pd_flags:表示页面状态。
pd_lower:执行line pointers末尾,也就是空闲空间的起始位置。
pd_uppder:指向最后一个tuple,也就是空闲空间的结束为止。
pd_special:用在索引页中,在索引页中它指向特殊空间的起始位置,在堆表页面中它指向页尾。
pd_pagesize_version:页面大小以及页面版本号。
pd_prune_xid:该xid主要用于页面内清理
line pointers:该指针数据指向每一个对应的tuple,也表示每个tuple在页内的偏移offset。
那么页头在存储数据过程中,有什么作用呢,下面通过tuple插入的过程,给大家展示下一些页头信息时如何更新的
(1)假设有一张表仅包含了一个tuple,那么该page header的pd_lower指向line pointers的第一个。在line pointers末尾和最后一个tuple之前的空间被称为free space。为了能够唯一确定页内的tuple,常用ctid(block number, offset)唯一确定对应的tuple。
(2)当插入第二个tuple,则生成line pointer递增,并指向第二个tuple。与此同时,pd_lower、pd_upper更新对应的指向,具体可见下图说明。
由此可见,随着数据的插入,页头信息也在不断实时更新。
总结:当然GaussDB(DWS)数据库不仅仅只有行存这一种存储格式,还有另外一种列存存储格式,后续的文章中我们会对列存页面结构跟大家进行讲解说明,对GaussDB(DWS)数据库底层数据存储有一个全面的认识。
- 点赞
- 收藏
- 关注作者
评论(0)