假如在一次 dml 操作中写了一千行数据,写了 100 个宏块,增量合并中会有多少个读 IO 和写 IO?
100,一个宏块一次IO
如果是涉及修改了100个宏块,那么一个宏块会有一次读一次写,相当于100次读100次写,但粒度应该是微块级的
1 个赞
但是从官档来看,微块是读的最小单位,难道不是每次读的都是微块,然后算读的次数时需要计算宏块里有多少微块?
- 宏块OceanBase 数据库将磁盘切分为大小为 2MB 的定长数据块,称之为宏块(Macro Block),宏块是数据文件写 IO 的基本单位,每个 SSTable 就由若干个宏块构成, 宏块2M固定大小的长度不可更改, 后续转储合并重用宏块以及复制迁移等任务都会以宏块为最基本粒度。
- 微块在宏块内部数据被组织为多个大小为 16KB 左右的变长数据块,称之为微块(Micro Block),微块中包含若干数据行(Row),微块是数据文件读 IO 的最小单位。每个数据微块在构建时都会根据用户指定的压缩算法进行压缩,因此宏块上存储的实际是压缩后的数据微块,当数据微块从磁盘读取时,会在后台进行解压并将解压后的数据放入数据块缓存中。每个数据微块的大小在用户创建表时可以指定,默认 16KB,用户可以通过语句指定微块长度,但是不能超过宏块大小,语句如下。
微块读io的次数和宏块有多少微块没什么关系吧
这个问题要回答可能要分非常多场景
- 首先针对这个背景 “在一次 dml 操作中写了一千行数据,写了 100 个宏块” 我们可以先把这个前提认为是增量数据转储写了100个宏块
- 针对问题 增量合并中会有多少个读 IO 和写 IO?
- 如果没有基线数据, 那么转储数据全部读一次, 这里读取粒度以宏块为粒度, 所以有100个2M读取, 基线数据压缩率更高, 假设写下去50个宏块, 那么有50个2M写
- 如果基线数据和转储数据没有交集, 同上
- 如果转储数据和基线数据交集很多, 基线数据可能要读取, 同时新基线的数据难以评估会有多少, 这个不好说
综合看, 后台的合并任务基本上所有读取和写入都是2M为粒度, 因为所有数据都是要读取的, 但是部分场景会有出入
- 基线数据的purge流程, 可能需要做临时的查询, 会有部分的微块读取
- 并行合并的时候, 转储sstable处在切分边界的宏块可能会读取两次
1 个赞