延迟物化简介
延迟物化(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_fastscan 为 ON 时,延迟物化与快速扫描互斥,实例会自动关闭延迟物化并输出警告,可通过 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/OFF 与 1/0 两种写法,二者等价。