首批通过分布式安全可靠测评,为关键业务系统打造
数据删除后的空表查询耗时长
更新时间:2024-01-22 01:56
适用版本
OceanBase 数据库 V3.x 版本。
问题现象
业务进行 TPS 性能压测时,发现一条 SQL 存在性能问题,即表数据为空,但是查询耗时久。在测试环境下进行复现,发现当表数据被删除的时候,确实会有这种情况发生。
问题原因
类似 Oracle 的 HWM 高水位线问题。OceanBase 数据库执行 Delete 操作时,并没有直接清空 SSTable/MemTable 里的记录,只是对数据做了删除标记,用于多版本查询使用。执行器在进行 table scan 时,即使是一个已经清空了的表,依然会读到已经被删除的记录,因此执行耗时较长。
当使用 truncate 清空表或分区时,因为是对表、分区进行了 drop、create 的重建,不会有残留的数据,因此不会有类似的问题。
在 OceanBase 数据库中,被删除的数据会在满足以下条件时被正在清空(空间回收)。
- 当一条记录的多版本的数据过多,且超过了
undo_retention的范围时,OceanBase 数据库会进行多版本数据的回收。 - 如果表的属性为 Queuing,则在转储时对删除的记录进行回收。
- 合并时,会对删除的记录进行回收。
解决办法
可以尝试使用 Queuing 表。
obclient> ALTER TABLE user_table TABLE_MODE = 'queuing';