首批通过分布式安全可靠测评,为关键业务系统打造
自适应合并
更新时间:2026-05-16 15:55:42
OceanBase 数据库从 V4.1.0 版本开始支持自适应合并。开启自适应合并后,系统会实时采集并统计用户的查询、写入等信息,再根据这些信息来识别可能导致的查询慢的场景,自适应地调度合并任务,达到对用户无感知地解决相关场景可能导致的慢查询问题。自适应合并开启期间,系统以分区为维度进行统计信息的采集及合并任务的调度。
使用自适应合并功能,可以解决如下问题:
避免一部分 Buffer 表问题的出现。
优化导数场景下的查询性能。
识别并规避一部分慢查询场景。
触发规则
当分区 Leader 满足一定条件时,系统就会自动为该分区及 Follower 副本调度自适应合并。自适应合并的触发规则如下:
系统通过分析一段时间内分区的统计信息,获取到该分区查询和转储的次数以及增量数据中 Insert 行数的占比,确认该场景是否为导数场景。如果是导数场景,则对该分区触发自适应合并。
系统通过分析一段时间内分区的统计信息,获取到该分区转储的次数以及增量数据中更新和删除行的占比,确认该场景是否为导数场景。如果是导数场景,则对该分区触发自适应合并。
系统通过统计分区增量数据的总行数,确认该场景是否为持续写入场景,如果是持续写入场景,系统对该分区触发自适应合并。
系统通过查询扫描的数据量与实际有效数据的比例,确认针对该分区的查询是否为慢查询,如果为慢查询,系统对该分区触发自适应合并。
注意事项
自适应合并可以有效减少一部分查询慢的问题,如果您的业务对查询性能要求比较高,并且存在自适应合并所支持的场景时,建议不要关闭自适应合并功能。
在 OceanBase 数据库中,名称以 "_" 开头的配置项均为隐藏配置项,仅供开发人员在故障排查或紧急运维时使用。如果确认需要关闭自适应合并功能,请联系技术支持人员协助处理。
步骤一:开启自适应合并
自适应合并功能由租户级隐藏配置项 _enable_adaptive_compaction 进行控制,默认为开启状态。
使用
root用户登录集群的sys租户。查询租户级隐藏配置项
_enable_adaptive_compaction的值。obclient [oceanbase]> SELECT * FROM oceanbase.GV$OB_PARAMETERS WHERE NAME LIKE '_enable_adaptive_compaction';查询结果如下:
+----------------+----------+-------+--------+-----------+-----------------------------+-----------+-------+---------------------------------------------------------------------------------+---------+-------------------+---------------+-----------+ | SVR_IP | SVR_PORT | ZONE | SCOPE | TENANT_ID | NAME | DATA_TYPE | VALUE | INFO | SECTION | EDIT_LEVEL | DEFAULT_VALUE | ISDEFAULT | +----------------+----------+-------+--------+-----------+-----------------------------+-----------+-------+---------------------------------------------------------------------------------+---------+-------------------+---------------+-----------+ | 172.xx.xxx.xxx | 2882 | zone1 | TENANT | 1 | _enable_adaptive_compaction | BOOL | True | specifies whether allow adaptive compaction schedule and information collection | TENANT | DYNAMIC_EFFECTIVE | True | YES | | 172.xx.xxx.xxx | 2882 | zone1 | TENANT | 1001 | _enable_adaptive_compaction | BOOL | True | specifies whether allow adaptive compaction schedule and information collection | TENANT | DYNAMIC_EFFECTIVE | True | YES | | 172.xx.xxx.xxx | 2882 | zone1 | TENANT | 1002 | _enable_adaptive_compaction | BOOL | True | specifies whether allow adaptive compaction schedule and information collection | TENANT | DYNAMIC_EFFECTIVE | True | YES | | 172.xx.xxx.xxx | 2882 | zone1 | TENANT | 1003 | _enable_adaptive_compaction | BOOL | True | specifies whether allow adaptive compaction schedule and information collection | TENANT | DYNAMIC_EFFECTIVE | True | YES | | 172.xx.xxx.xxx | 2882 | zone1 | TENANT | 1004 | _enable_adaptive_compaction | BOOL | True | specifies whether allow adaptive compaction schedule and information collection | TENANT | DYNAMIC_EFFECTIVE | True | YES | +----------------+----------+-------+--------+-----------+-----------------------------+-----------+-------+---------------------------------------------------------------------------------+---------+-------------------+---------------+-----------+ 5 rows in set查询结果中,
VALUE列对应的值为True,表示已开启自适应合并。如果未开启自适应合并,可以执行以下语句,开启自适应合并。
obclient [oceanbase]> ALTER SYSTEM SET _enable_adaptive_compaction = True TENANT = tenant_name;注意
由于自适应合并调度任务的执行会占用部分系统资源,为了减少系统资源的占用,您可以通过将租户级隐藏配置项
_enable_adaptive_compaction的值修改为False来关闭除 extreme 模式表以外的其他自适应合并的调度。
(可选)步骤二:通过表选项 table_mode 指定自适应合并策略
开启自适应合并后,为了更加灵活地解决 Buffer 表带来的性能下降问题,OceanBase 数据库在 V4.2.3 版本开始支持表选项 table_mode。用户可以通过为每张表设置不同的 table_mode 值以便指定不同的快速冻结与自适应合并策略以应对 Buffer 表问题。
您可以在创建表或修改表时,通过表选项 table_mode 指定不同模式的自适应合并策略。表选项 table_mode 提供了以下 5 种模式来对应不同的合并策略。
| 模式 | 转储后触发合并的概率 |
|---|---|
| normal(默认值) | 极低 |
| queuing | 低 |
| moderate | 中 |
| super | 高 |
| extreme | 极高 |
如果您对业务比较熟悉和了解,您可以在创建表时根据业务情况,为表设置一个合适的模式。例如,创建一张 queuing 模式的表,示例如下。
obclient> CREATE TABLE tbl1 (c1 int, c2 double) table_mode = 'queuing';
在上述语句中,如果不显式指定 table_mode 值,则系统默认创建的是 normal 模式的表。
创建表后,当您观测到某张表的读放大现象严重,并出现了 Buffer 表现象时,您可以根据业务需要,手动修改该表的 table_mode,以便系统更频繁地触发该表的合并,加速查询。由于合并的频率越高,消耗的计算资源将会更多,建议您根据触发合并的频率从低到高逐级调整 table_mode 值。例如,先从 normal 调整到 queuing,观察一段时间后再从 queuing 调整到 moderate。调整示例如下。
obclient> ALTER TABLE tbl1 SET table_mode = 'moderate';
修改表的语句执行成功后,系统会有一定的延时(大约 2 分钟),待修改生效后,系统将以配置的合并模式调度自适应合并以解决 Buffer 表现象。