Skip to content

Latest commit

 

History

History
21 lines (14 loc) · 1.54 KB

column-pruning.md

File metadata and controls

21 lines (14 loc) · 1.54 KB
title aliases summary
列裁剪
/docs-cn/dev/column-pruning/
列裁剪是优化器在优化过程中删除不需要的列的基本思想。这样可以减少 I/O 资源占用并为后续优化带来便利。TiDB 会在逻辑优化阶段进行列裁剪,减少资源浪费。该扫描过程称作“列裁剪”,对应逻辑优化规则中的 columnPruner。如果要关闭这个规则,可以参照优化规则及表达式下推的黑名单中的关闭方法。

列裁剪

列裁剪的基本思想在于:对于算子中实际用不上的列,优化器在优化的过程中没有必要保留它们。对这些列的删除会减少 I/O 资源占用,并为后续的优化带来便利。下面给出一个列重复的例子:

假设表 t 里面有 a b c d 四列,执行如下语句:

{{< copyable "sql" >}}

select a from t where b > 5

在该查询的过程中,t 表实际上只有 a, b 两列会被用到,而 c, d 的数据则显得多余。对应到该语句的查询计划,Selection 算子会用到 b 列,下面接着的 DataSource 算子会用到 a, b 两列,而剩下 c, d 两列则都可以裁剪掉,DataSource 算子在读数据时不需要将它们读进来。

出于上述考量,TiDB 会在逻辑优化阶段进行自上而下的扫描,裁剪不需要的列,减少资源浪费。该扫描过程称作 “列裁剪”,对应逻辑优化规则中的 columnPruner。如果要关闭这个规则,可以在参照优化规则及表达式下推的黑名单中的关闭方法。