页布局(Page Layout)

  页是SinoDB的最小I/O单元,他的布局结构包含:页眉、数据、槽表、时间戳。具体布局请见下图:
image

  • 页眉(Page header)
      页眉占据页面上的前24个字节。它包含页面的位置、类型和当前容量等信息。SinoDB页眉结构由9个元素组成,如下图:
元素 字节 描述
pg_offset 4 页在块(chunk)中的偏移位置
pg_chunk 2 块(chunk)编号
pg_cksum 2 用于检查页的一致性
pg_nslots 2 槽表的最大活动数
pg_flags 2 页标识
pg_frptr 2 指向页上最后一个槽的槽尾
pg_frcnt 2 页的可用字节数
pg_next 4 对于索引页,指向同一级别的下一个节点
pg_prev 4 对于索引页,指向同一级别的下一个节点
  • 槽表(Slot table)
      槽表用于使数据库服务器能够快速查找页上的数据。它是一系列的4字节条目,从时间戳的起始位置开始,逐渐向页头的方向增长。在页上的每个槽表是描述表的一个条目,该槽表可以包含数据行或其他结构。每个槽表由两部分组成:槽的第一个字节的位置和槽的长度。槽表条目充当一种指针,允许直接、随机访问页面上的槽。

  • 时间戳
      页尾的时间戳用于与其他页进行比较,以验证页一致性。每次修改页内容时,都会在页尾放置一个时间戳。然后可以使用时间戳与其他面进行比较,以确定哪个页是最近更新的。

页大小超过限制时,会提示:Could not insert new row into the table。此时需要进行分析。
SinoDB每个表分片的物理页个数最大是16775134字节,使用oncheck -pt 可以查看表当前物理页的使用量。
解决方法:

  1. Range分片:数据按照某个范围的条件进行分片,例如按照日期范围、数值范围等。这种方式使得在查询中可以根据范围进行优化。
  2. List分片:数据按照某个列上的特定值列表进行分片。这样,每个分片包含特定列值的数据。
  3. Round Robin分片:数据均匀地分布到所有可用的分片中。这种方式可以帮助平衡负载,但可能导致某些分片的数据量较大。
    等等。。SinoDB还提供了一些自定义的分片策略选项,允许数据库管理员定义自己的分片逻辑。