GaussDB(DWS)存储系列之行存表
【摘要】 GaussDB(DWS)实时数仓的数据都是存储在非易失性的存储设备上,本文从行存表的存储结构出发,帮助大家更好的了解GaussDB是怎么在物理磁盘上存储数据的。
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)数据库底层数据存储有一个全面的认识。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
瘸子那条好腿2020/11/10 09:01:071楼编辑删除举报
匿名用户群体2020/11/10 09:03:142楼编辑删除举报
专业搬砖2022/06/13 15:32:023楼编辑删除举报