---
title: OceanBase 数据库 buffer 表现象及规避方法 -OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于OceanBase 数据库 buffer 表现象及规避方法 相关的常见问题和使用技巧，帮助您快速解决OceanBase 数据库 buffer 表现象及规避方法 的难题。
---
切换语言

- 简体中文
- English

划线反馈

# OceanBase 数据库 buffer 表现象及规避方法

更新时间：2023-11-30 12:01

适用版本： V2.2.x、V3.1.x、V3.2.x 内容类型：TechNote  

buffer 表是一种短时间内大量进行写入、修改、删除操作的表的统称。本文介绍如何规避 buffer 表。

## 适用版本

OceanBase 数据库 V2.x 版本

## buffer 表现象

buffer 表是一种短时间内大量进行写入、修改、删除操作的表的统称。

LSMT 架构中，MemTable 中对数据行的更新与删除操作并不是在该行操作，而是通过把变更链接在 rowkey 的链表后面按时间排序实现的。随着旧版本数据变多，会导致合并过程中数据扫描的链路更长。

这种场景下，优化器的估行会出现严重失准，观测到逻辑行和物理行的行数差也会很大。

这种频繁地操作方式带来的影响在 LSMT 的架构下一直存在，只是 buffer 表的使用方式（随机写或更新较多）将这个现象放大了。

可以通过以下 SQL 查询 buffer 表所属的租户名称、表 ID 与表名。其中，`delete_row_count/(total_row_count + 1)` 表示所有转储中的删除行数的绝对值以及相对基线的比例，`0.9` 表示认为是 buffer 表的阈值。

```unknow
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 以消除多版本，减少层级。

  ```unknow
  obclient> ALTER SYSTEM MAJOR FREEZE;

  ```
 - 对于由于 CBO 统计信息不准确导致查询计划变更，可以通过创建 outline 绑定查询语句。有关创建 outline 的方式，请参见 [如何使用 outline 绑定执行计划](https://www.oceanbase.com/knowledge-base/oceanbase-database-20000000189)。

Previous

[如何把 queuing 表转回普通表](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000207716)

Next

[全局临时表自动分区的原因](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000450143) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
