一、延迟物化简介
延迟物化通过推迟非谓词列的读取与解压时机,减少了不必要的 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:关闭延迟物化 |
| 作用域 | GlobalSession |
| 是否支持 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。
五、使用限制
·延迟物化仅在列存只读分析实例执行的查询中生效,行存执行不触发。
·表的估算行数低于 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 两种写法,二者等价。