关于 OceanBase SSTable 的读放大问题及优化机制,以下说法正确的是?
A. 读放大是指查询时需要扫描的磁盘数据量远大于实际返回数据量。OceanBase 通过提高压缩率来直接减少读放大。
B. 在 OceanBase 中,每个 SSTable 的微块(Micro Block)均包含数据索引,查询时先定位到宏块,再通过索引过滤微块,可有效减少读放大。
C. 读放大只能通过增大微块大小来缓解,因为更大的微块能包含更多连续数据,减少随机 I/O。
D. OceanBase 的 Bloom Filter 缓存可以完全消除索引扫描时的读放大问题,将查询复杂度降到 O(1)。
解析 :
SSTable 的读放大主要源于查询需要读取多个微块甚至整个宏块才能找到少量目标数据。OceanBase 在每个宏块内部维护微块的索引(最小键、最大键、行数等),查询时可以先读索引,跳过不包含目标数据的微块,只读取相关的微块,从而显著减少读放大。
-
A 错误 :压缩主要减少存储空间 和传输带宽,但不能直接减少读放大。读放大是 I/O 范围问题,不是数据大小问题。即使数据压缩了,仍可能读取大量无用数据。
-
B 正确 :微块索引是 OceanBase 减少读放大的核心设计之一,通过索引快速过滤无关微块,避免读取整个宏块。
-
C 错误 :增大微块可能加剧读放大 ,因为粗粒度的微块包含更多无关数据。减小微块可以更精细地裁剪,但会增加索引开销。需权衡,而不是单调增大。
-
D 错误 :Bloom Filter 用于快速判断某个键不存在于 某个宏块或微块中,可以避免无效 I/O,但无法消除所有读放大,更不能降到 O(1)。且 Bloom Filter 有误判率,存在时仍需实际读取验证。