8s
数据库存储页
数据库是存储和管理数据的仓库,而数据是存储在表中的, 数据库空间的有效使用和
维护不仅是数据库管理的重要工作,也是大多数开发人员所关心的内容,它直接关系着数
据库性能的发挥。
Gbase8s
产品的数据是按行存储在磁盘上的,对于数据库来说,庞大的数据并不是一
行一行读取出来的,这样效率很低,且繁琐。因而
8s
数据库是将每行数据集中到其所在的
页上进行加载,页也是其存储结构里最基本的物理单位。
物理单位包含:由磁盘分区获得的
chunk
,以
8
为基数将
page
连在一起的
extent
,和
最大存储
255
行数据的
page
。
对于其对应关系,我们可以带入到生活中常见的东西作为例子,比如图书馆是一整张
磁盘,每一个书架是一个
chunk
,书架上每一层书是
extent
,每一本书是最基本的
page
。
亦或是体育场是一张磁盘,一组一组的区域是
chunk
,每个区域上的椅子便是
page
,椅子
8
个
8
个连在一起构成了
extent
。
在页中,它包含:页头、数据部分和页尾,三大部分。页头有八个部分,分别是
pageaddress
用来表明该页是第几个
chunk
的第几个
page
,正因为其使用
2byte
记录
chunk
号,
4byte
记录
page
号,导致数据库最大支持
32767
个
chunk
,和每个
chunk
里会有
21
亿
个
page
的个数,而在
linux
下
page
会默认设置为
2k
大小,通过相乘便可得知一般情况下每
个
chunk
大约会有
4T
的容量。
chksum
用来校验保重数据正确,
ag
用来表示该页的性质,
nslots
表示该表有多少行(槽)数据,
pfree
指向下一个待输入的行(槽)的位置,
nfree
空
余空间大小,以及两个指向上一页和下一页的指针。它的大小是不变的为
24byte
。
页尾含有两个部分,时间戳和槽信息表。时间戳顾名思义是用来记录上次输入数据后
的时间信息,行(槽)信息表是包含了每一行数据的大小和起始位置。当该
page
是新创建
的时候,数据部分为零,那么槽表的大小也为
0
,只有
page
存储行的时候,槽表才会相应
插入一条
4byte
的数据和新行来对应。那么页尾的大小是变化的,根据该页拥有多少行数
据决定的,时间戳是不变的
4byte
大小,一个
n
行数据的
page
,他的页尾大小则为
(
4+4n
)
byte
。
初始环境下一张表会预设
8
个
page
用来存储数据,这便是
extent
,而之后的
extent
的
大小,会由我们对表的列级操作,而扩充合适的大小,但每次扩充的新
extent
的数据页的
个数均为
8
的倍数。
评论