适用版本
OceanBase 数据库 V2.X 版本
buffer 表现象
buffer 表是一种短时间内大量进行写入、修改、删除操作的表的统称。
LSMT 架构中,MemTable 中对数据行的更新与删除操作并不是在该行操作,而是通过把变更链接在 rowkey 的链表后面按时间排序实现的。随着旧版本数据变多,会导致合并过程中数据扫描的链路更长。
这种场景下,优化器的估行会出现严重失准,观测到逻辑行和物理行的行数差也会很大。
这种频繁地操作方式带来的影响在 LSMT 的架构下一直存在,只是 buffer 表的使用方式(随机写或更新较多)将这个现象放大了。
可以通过以下 SQL 查询 buffer 表所属的租户名称、表 ID 与表名。其中,
delete_row_count/(total_row_count + 1)
表示所有转储中的删除行数的绝对值以及相对基线的比例,
0.9
表示认为是 buffer 表的阈值。
obclient> SELECT tenant_name, table_id, table_name FROM __all_virtual_table a,__all_tenant b WHERE a.tenant_id=b.tenant_id AND table_id IN (SELECT DISTINCT table_id FROM __all_virtual_partition_sstable_merge_info a, __all_tenant b WHERE a.tenant_id=b.tenant_id AND merge_type=‘major merge’ AND delete_row_count/(total_row_count + 1) > 0.9 and major_table_id=0) ORDER BY table_name;
规避方式
有两种解决方式,您可以选择其中一种:
- 手动执行 MAJOR FREEZE 以消除多版本,减少层级。
obclient> ALTER SYSTEM MAJOR FREEZE;
- 对于由于 CBO 统计信息不准确导致查询计划变更,可以通过创建 outline 绑定查询语句。有关创建 outline 的方式,请参见 如何使用 outline 绑定执行计划。