延迟物化

最近更新时间:2026-06-30 16:45:31

我的收藏

延迟物化简介

延迟物化(Late Materialization)是 TDSQL Boundless 只读分析实例在执行 SQL 查询时使用的一项扫描优化技术:当查询无法命中主键或索引、需要进行全表扫描(TableScan)时,实例不会一次性读取所有目标列,而是先读取谓词列并完成过滤,再按过滤结果回头读取真正需要的非谓词列。
延迟物化通过推迟非谓词列的读取与解压时机,减少了不必要的 I/O 和 CPU 开销,从而显著降低分析查询在列存场景下的扫描代价。
说明:
延迟物化仅在 TDSQL Boundless 只读分析实例中生效,行存执行不会触发该优化。

延迟物化的优势

降低解压开销。列存数据是按列压缩存储的,物化必须解压相关数据。延迟物化将解压范围限制在谓词列以及过滤后命中的少量行,明显降低 CPU 解压开销。
减少 I/O。早期物化会先读取并组合所有列数据,但其中部分列可能并不会出现在最终结果中。延迟物化只读取真正需要的列,减少不必要的 I/O。
更好地配合列式执行。过滤、聚合等算子直接作用于列数据,能够更充分地利用列存的批量处理与向量化能力,进一步提升查询执行速度。

工作原理

延迟物化在物理计划阶段引入 Column Read 算子,将原本一次性的 TableScan 拆分为两个阶段:
1. 早期阶段:仅读取谓词列,由 TableScan 内嵌的 Selection 完成过滤,输出命中行的行号集合。
2. 后期阶段Column Read 算子根据命中的行号,仅回头读取并解压尚未读取的非谓词列。
除全表扫描场景外,TDSQL Boundless 也会在 TopN 紧邻 TableScan 的查询形态中尝试延迟物化:先按 TopN 排序键扫描定位结果行,再仅物化最终输出所需的列数据。

参数说明

延迟物化由系统变量 libra_enable_late_materialization 控制总开关,开启时为 ON
属性
说明
参数类型
BOOL
默认值
ON
取值范围
ON:开启延迟物化;
OFF:关闭延迟物化
作用域
Global
Session
是否支持 SET_VAR
支持
-- 在 Session 级别关闭延迟物化
SET libra_enable_late_materialization = OFF;

-- 在 Session 级别开启延迟物化
SET libra_enable_late_materialization = ON;
除总开关外,TDSQL Boundless 还提供以下调优参数,用于精细控制延迟物化的触发条件与行为。
参数名
类型
默认值
说明
libra_minimum_rows_to_enable_late_materialization
INT
8192
表估算行数低于该阈值时不启用延迟物化
libra_minimum_selectivity_to_enable_late_materialization
FLOAT
0.9
单个谓词的选择率必须低于该阈值才会被下推到 TableScan 用于过滤
libra_late_materialization_size_threshold
FLOAT
0.5
估算延迟物化后读取数据量与原读取数据量的比值阈值,超过该值则放弃优化
libra_enable_late_materialization_trace
BOOL
OFF
开启后会在日志中输出延迟物化的接受或拒绝原因,便于调优与排查
上述参数的作用域均为 Global、Session,并支持 SET_VAR Hint。

使用限制

延迟物化仅在列存只读分析实例执行的查询中生效,行存执行不触发。
当系统变量 tiflash_fastscanON 时,延迟物化与快速扫描互斥,实例会自动关闭延迟物化并输出警告,可通过 SHOW WARNINGS 查看。
表的估算行数低于 libra_minimum_rows_to_enable_late_materialization 阈值(默认 8192)时,延迟物化不生效。
谓词的选择率高于 libra_minimum_selectivity_to_enable_late_materialization 阈值(默认 0.9)时,对应谓词不会被采纳为延迟物化的过滤条件。

查看执行计划

执行 EXPLAIN 语句可观察延迟物化是否生效。延迟物化生效时,执行计划中会出现 Column Read 算子(在简要模式下显示为 COLUMN READ),表示部分列推迟到该算子才进行物化。

如需获取更详细的延迟物化决策信息(如哪些谓词被采纳、哪些被拒绝及原因),可开启 trace 开关:
SET libra_enable_late_materialization_trace = ON;
开启后,相关决策信息会输出到列存只读分析实例日志中。

通过 Hint 控制延迟物化

libra_enable_late_materialization 支持 SET_VAR Hint,可在单条 SQL 语句中开启或关闭延迟物化,不影响其他会话或语句。示例如下:
-- 在单条 SQL 中开启延迟物化
SELECT /*+ SET_VAR(libra_enable_late_materialization=ON) */ *
FROM t WHERE c1 = 1 AND c2 = 1;

-- 在单条 SQL 中关闭延迟物化
SELECT /*+ SET_VAR(libra_enable_late_materialization=OFF) */ *
FROM t WHERE c1 = 1 AND c2 = 1;
说明:
SET_VAR Hint 中的取值同时支持 ON/OFF1/0 两种写法,二者等价。