本文主要介绍如何修改 OceanBase 数据库的合并方式。
您可以通过表级属性
progressive_merge_num
来控制合并行为,也可以通过
default_progressive_merge_num
配置项来设置新建一张表时默认的渐进合并次数。
当您未对新建表指定
progressive_merge_num
属性时,系统会将表级属性
progressive_merge_num
的值设置为
default_progressive_merge_num
的值。
progressive_merge_num
属性的取值含义如下:
- 0 :表示执行渐进合并,且渐进合并的次数为 100。
- 1:表示强制执行全量合并,不执行渐进合并。
- 大于 1 :表示发生 Schema 变更时按照指定轮次做渐进合并。
适用版本
OceanBase 数据库所有版本
全量合并
在全量合并过程中,会把当前的静态数据都读取出来,和内存中的动态数据合并后,再写到磁盘上去作为新的静态数据。
可以将表属性
progressive_merge_num
设置为
1
,表示将合并方式修改为全量合并。
obclient> ALTER TABLE $table SET progressive_merge_num=1;
增量合并
增量合并是相对于全量合并而言的概念,大多数情况下,当需要进行合并时并不是所有的宏块都需要被修改,当一个宏块没有增量修改时,可以直接重用它,而不是重写它,这种方式称之为增量合并。相对于全量合并的把所有的宏块的重写一遍而言,增量合并只重写发生了修改的宏块。
将表属性
progressive_merge_num
修改为
0
时,表示将合并方式设置为增量合并。
obclient> ALTER TABLE $table SET progressive_merge_num=0;
渐进合并
渐进合并是全量合并的一种实现方式。在一次合并过程中完成对所有数据的重写,对存储空间和合并时间都会是一个比较大的考验。为了解决这个问题,OceanBase 数据库引入了渐进合并,即把数据重写分散到多次合并中去做。假设把渐进轮次设置为
60
,那么一次合并就只会重写六十分之一的数据,在六十轮合并过后,数据就被整体重写了一遍。渐进合并减轻了 DBA 做 DDL 操作的负担,同时也使得 DDL 变得更加平滑。
将表属性
progressive_merge_num
设置为大于
1
的值时,表示将合并方式修改为渐进合并,并且每次合并
1/num
的数据。
obclient> ALTER TABLE $table SET progressive_merge_num=$num;