什么是晚期物化
晚期物化(Late Materialization) 是 OceanBase 数据库中的一种查询执行优化技术,主要用于包含 ORDER BY 和 LIMIT 的查询场景,特别是在涉及大宽表或包含 LOB 等大型数据类型字段的表时,能够显著减少数据扫描量和 I/O 开销,提升查询性能。
核心原理
晚期物化的核心思想是:延迟回表(Delayed Lookup),即在执行过程中,先通过索引完成数据的过滤和排序操作,仅保留最终需要返回的少量行(由 LIMIT 决定),再根据这些行的主键去主表中获取完整的列数据。
这避免了在早期阶段就进行全列回表,从而大幅减少了不必要的数据读取和处理。
执行流程对比
✅ 启用晚期物化(推荐)
以如下查询为例:
SELECT /*+index(t idx) */ * FROM t1 t WHERE c1 > 0 ORDER BY c2 LIMIT 10;
执行计划如下:
|ID|OPERATOR |NAME |EST. ROWS|COST |
|0 |NESTED-LOOP JOIN| |10 |14855|
|1 | TOP-N SORT | |10 |14842|
|2 | TABLE SCAN |t(idx) |93114 |11972|
|3 | TABLE GET |t1_alias|1 |2 |
- 步骤 2:仅扫描索引
idx(c1, c2, c3),获取满足c1 > 0的主键pk和排序列c2。 - 步骤 1:对主键按
c2排序,并保留前 10 条。 - 步骤 3:通过主键逐行回表(
TABLE GET)获取完整列(如c3,c4)。 - 优点:只回表 10 次,极大减少 I/O。
❌ 禁用晚期物化
使用 Hint 禁用该优化:
SELECT /*+index(t idx) no_use_late_materialization*/ * FROM t1 t WHERE c1 > 0 ORDER BY c2 LIMIT 10;
执行计划变为:
|ID|OPERATOR |NAME |EST. ROWS|COST |
|0 |TOP-N SORT | |10 |265257|
|1 | TABLE SCAN|t(idx)|93114 |262387|
- 步骤 1:每次通过索引找到记录后,立即回表获取所有列(
*),导致需回表 93114 次。 - 缺点:大量冗余数据被读取和排序,资源消耗极高(COST 提升近 18 倍)。
适用场景
晚期物化特别适用于以下情况:
- 查询包含
ORDER BY + LIMIT。 - 表为大宽表或包含 LOB、TEXT 等大字段。
- 过滤条件和排序列可被复合索引覆盖。
- 只需返回少量结果(如分页查询的前几页)。
控制方式
OceanBase 优化器会自动判断是否启用晚期物化。如需禁用,可通过 Hint 实现:
/*+ no_use_late_materialization */
反之,若希望强制启用(通常无需指定),优化器默认会在合适场景下自动应用。
总结
晚期物化是一种高效的执行策略,通过“先过滤排序、后回表取数”的方式,显著降低了高选择性查询中的数据处理量。它是 OceanBase 查询优化器在处理分页查询、排行榜类场景时的重要优化手段之一。
更多细节可参考官方文档:排序 limit 场景性能优化 – 减少扫描/计算开销