延迟物化

最近更新时间:2024-10-31 16:56:11

我的收藏

什么是延迟物化

在数据库执行 SQL 查询时,若无法命中主键或索引键,将不得不进行全表扫描(TableScan),这种全量数据扫描的代价通常较高。为了优化这一过程,可以采用延迟物化(Lazy Materialization)技术,该技术通过推迟数据的物化,直到查询执行阶段才进行必要的计算和存储,进而提升查询性能和系统响应速度。
在只读分析引擎执行 SQL 查询的过程中,首先会读取谓词列,并利用 Filter 算子进行计算,从而得到过滤后的结果。随后,只读分析引擎会根据这些过滤结果物化其他需要读取的列数据。这种方法有效减少了非谓词列在大量过滤数据上的读取量,从而提高了扫描速度。

延迟物化的优势

在只读分析引擎中数据是被压缩过的,物化的过程就必须对数据进行解压,通过延迟物化技术可以减少解压的数据范围,从而减轻解压缩所带来的 CPU 开销。
当 SQL 查询涉及多个列时,早期物化可能会导致数据库读取并组合所有列的数据,尽管其中一些列可能并不会用于最终结果的查询。相比之下,延迟物化策略则推迟了数据的组合过程,使得数据库仅读取和处理那些真正需要的列数据。这种做法有效减少了不必要的 I/O 操作,从而提高了查询效率。
延迟物化可以让过滤、聚合等操作更加高效,因为这些操作只需要处理列数据,而不需要处理整行数据。列存储的特性(如数据压缩、批量处理)能够更好地发挥作用,从而加快查询执行速度。

延迟物化相关参数

延迟物化功能可以通过参数 libra_enable_late_materialization 进行开关,参数值为 ON,表示已经开启延时物化功能。
属性
描述
参数类型
BOOL。
默认值
ON。
取值范围
ON:打开延迟物化功能。
OFF:关闭延迟物化功能。
作用域
Global & Session。
支持 SET_VAR Hint
是。
#在 session 级别关闭延迟物化
set libra_enable_late_materialization=off;
#在 session 级别开启延迟物化
set libra_enable_late_materialization=on;

延迟物化示例

如下图所示,当开启延迟物化时,可以从执行计划清晰的看到 COLUMN READ 算子。此算子即为延迟物化功能生效的示例。


如何在 HINT 中设置延迟物化

通过 SET_VAR Hint 可以在单条 SQL 语句中指定开启或关闭延迟物化,示例如下。
select /*+ set_var(libra_enable_late_materialization=1)*/ * from t where c1=1 and c2=1;