云社区 博客 博客详情

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

AndyCao 发表于 2020-11-10 11:27:34 2020-11-10
2
7

【摘要】 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)数据库底层数据存储有一个全面的认识。



登录后可下载附件,请登录或者注册

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

下一篇:GaussDB(DWS)存储系列之pagehack&pg_xlogdump工具使用方法总结

评论 (2)


戴口罩的小新

1楼2020-11-10 17:01:07

DWS殿阁大学士

2楼2020-11-10 17:03:14

登录后可评论,请 登录注册

评论