什么是延迟物化
在数据库执行 SQL 查询时,若无法命中主键或索引键,将不得不进行全表扫描(TableScan),这种全量数据扫描的代价通常较高。为了优化这一过程,可以采用延迟物化(Lazy Materialization)技术,该技术通过推迟数据的物化,直到查询执行阶段才进行必要的计算和存储,进而提升查询性能和系统响应速度。
在只读分析引擎执行 SQL 查询的过程中,首先会读取谓词列,并利用 Filter 算子进行计算,从而得到过滤后的结果。随后,只读分析引擎会根据这些过滤结果物化其他需要读取的列数据。这种方法有效减少了非谓词列在大量过滤数据上的读取量,从而提高了扫描速度。
延迟物化的优势
在只读分析引擎中数据是被压缩过的,物化的过程就必须对数据进行解压,通过延迟物化技术可以减少解压的数据范围,从而减轻解压缩所带来的 CPU 开销。
当 SQL 查询涉及多个列时,早期物化可能会导致数据库读取并组合所有列的数据,尽管其中一些列可能并不会用于最终结果的查询。相比之下,延迟物化策略则推迟了数据的组合过程,使得数据库仅读取和处理那些真正需要的列数据。这种做法有效减少了不必要的 I/O 操作,从而提高了查询效率。
延迟物化可以让过滤、聚合等操作更加高效,因为这些操作只需要处理列数据,而不需要处理整行数据。列存储的特性(如数据压缩、批量处理)能够更好地发挥作用,从而加快查询执行速度。
延迟物化相关参数
延迟物化功能可以通过参数 libra_enable_late_materialization 进行开关,参数值为 ON,表示已经开启延时物化功能。
|
参数类型 | BOOL。 |
默认值 | ON。 |
取值范围 | ON:打开延迟物化功能。 OFF:关闭延迟物化功能。 |
作用域 | Global & Session。 |
支持 SET_VAR Hint | 是。 |
set libra_enable_late_materialization=off;
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;
本页内容是否解决了您的问题?