现在 iotdb 会因为自动参数优化将很小的数据块写入文件,使得数据文件变得零散化,这导致了用户进行即席查询时需要的读盘次数过多,而后期的合并过程又不是即时进行的,这导致了系统对热数据的查询效率变慢,所以我们借鉴了虚拟内存的思想,在写入流程中增加了合并过程,通过提高一部分写放大保证了写入到正式文件的数据块不小于给定阈值,提升系统即席查询的效率。将这部分逻辑写到 StorageGroupProcessor 里去,针对封口的 tsfile 文件进行合并。
设置 max_file_num_in_each_level = 3,tsfile_manage_strategy = LevelStrategy, max_level_num = 3,此时文件结构为,第0层、第1层、第2层,其中第2层是不再做合并的稳定的文件列表
假设此时整个系统中有5个文件,最后一个文件没有关闭,则其结构及顺序分布如下
level-0: t2-0 t3-0 t4-0 level-1: t0-1 t1-1
当最后一个文件关闭,按如下方式合并(第0层的t2-0、t3-0、t4-0文件合并到了第1层的t2-1文件)
level-0: t2-0 t3-0 t4-0
\ \ |
\ \ |
\ \ |
\ \ |
level-1: t0-1 t1-1 t2-1
合并后发现第1层合并后也满了,则继续合并到第2层,最后整个系统只剩下了第2层的t0-2文件
level-0: t2-0 t3-0 t4-0
\ \ |
\ \ |
\ \ |
\ \ |
level-1: t0-1 t1-1 t2-1
| / /
| / /
| / /
| / /
level-2: t0-2
假设此时整个系统中有4个文件,最后一个文件没有关闭,则其结构及顺序分布如下
level-0: t2-0 t3-0 level-1: t0-1 t1-1
当最后一个文件关闭,但是t0-1、t1-1、t2-0、t3-0文件的 chunk point 数量加起来已经满足 merge_chunk_point_number,则做如下合并,即直接将所有文件合并到第2层(稳定层)
level-0: t2-0 t3-0
| |
level-1: t0-1 t1-1
| /
| /
| /
level-2: t0-2
从0.10.0升级
提高 max_level_num
level-0: t2-0 t3-0 t4-0 level-1: t0-1 t1-1
假设 {size(t2-0)+size(t3-0)+size(t4-0)< merge_chunk_point_number},则进行合并的过程如下
level-0: t2-0 t3-0 t4-0
\ \ |
\ \ |
\ \ |
\ \ |
level-1: t0-1 t1-1 t2-1
合并后发现第1层合并后也满了,则继续合并到第2层,最后整个系统只剩下了第2层的t0-2文件
level-0: t2-0 t3-0 t4-0
\ \ |
\ \ |
\ \ |
\ \ |
level-1: t0-1 t1-1 t2-1
| / /
| / /
| / /
| / /
level-2: t0-2
level-0: t4-0 t5-0 t6-0 level-1: t0-2 t1-1 t2-1 t3-1
假设 {size(t2-0)+size(t3-0)+size(t4-0)< merge_chunk_point_number},则进行合并的过程如下
level-0: t2-0 t3-0 t4-0
\ \ |
\ \ |
\ \ |
\ \ |
level-1: t0-2 t1-1 t2-1 t3-1 t4-1
合并后发现第1层合并后也满了,则继续合并到第2层
level-0: t2-0 t3-0 t4-0
\ \ |
\ \ |
\ \ |
\ \ |
level-1: t0-2 t1-1 t2-1 t3-1 t4-1
| / /
| / /
| / /
| / /
level-2: t0-2
最后剩下的文件结构为
level-0: level-1: t3-1 t4-1 level-2: t0-2
level-2: t0-0 t1-0 t2-0 t3-0 t4-0
假设 {size(t0-0)+size(t1-0)>=merge_chunk_point_number},则进行第一次合并的过程如下
level-0: t0-0 t1-0 t2-0 t3-0 t4-0 t5-0(新增了文件才会触发合并检查)
| /
| /
| /
level-2: t0-2
假设 {size(t2-0)+size(t3-0)>=merge_chunk_point_number},则进行第二次合并的过程如下
level-0: t2-0 t3-0 t4-0 t5-0 t6-0(新增了文件才会触发合并检查)
\ |
\ |
\ |
level-2: t0-2 t2-2
假设 {size(t4-0)+size(t5-0)+size(t6-0)+size(t7-0)< merge_chunk_point_number},则进行第三次合并的过程如下
level-0: t4-0 t5-0 t6-0 t7-0(新增了文件才会触发合并检查)
| / /
| / /
| / /
| //
level-1: t4-1
level-2: t0-2 t2-2