OceanBase 数据库 buffer 表现象是什么?以及规避方法是什么?

适用版本

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 绑定执行计划

这个SQL适用更高版本的 OB 吗,4.x 有没有标准视图替换查询