GaussDB(DWS)存储系列之行存表

举报
AndyCao 发表于 2020/11/10 11:27:34 2020/11/10
【摘要】 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 headerpd_lower指向line pointers的第一个。line pointers末尾和最后一个tuple之前的空间被称为free space为了能够唯一确定页内的tuple,常用ctid(block number, offset)唯一确定对应的tuple

    (2)当插入第二个tuple,则生成line pointer递增,并指向第二个tuple。与此同时,pd_lowerpd_upper更新对应的指向,具体可见下图说明。

   由此可见,随着数据的插入,页头信息也在不断实时更新。


   总结:当然GaussDB(DWS)数据库不仅仅只有行存这一种存储格式,还有另外一种列存存储格式,后续的文章中我们会对列存页面结构跟大家进行讲解说明,对GaussDB(DWS)数据库底层数据存储有一个全面的认识。



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。