oceanbase SQL 晚期物化 执行计划

什么是晚期物化

晚期物化(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)获取完整列(如 c3c4)。
  • 优点:只回表 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 场景性能优化 – 减少扫描/计算开销

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注