原文链接:http://click.aliyun.com/m/13997/

Optimizer是MaxCompute处理SQL任务的优化器,它的主旨于在根据关系代数的等价描述将中间的执行计划进一步地等价变换,以生成代价更优的执行计划。Optimizer内部有很多优化器,此文章将会介绍其中一种优化器--表达式约化(ExpressionReduction)。

接下来根据一个具体的例子来描述:

如表table_src (foo STRING, bar BIGINT)SELECT foo like '%ood',  concat('hello', 'world'), avg(bar) over (partition by concat(foo, 'day')) FROM table_src WHERE foo = 'good' and datediff(to_date('2016-07-01', 'yyyy-mm-dd'), to_date('2016-06-30', 'yyyy-mm-dd'), 'dd') = 1

ExpressionReduction可以针对所有存在的表达式进行计算,而目前主要在三种操作符进行优化:Select、Filter和Window。

  • Select: 是指对数据进行映射,生成的执行计划中会有个Project操作符

  • Filter: 是指对数据进行过滤,生成的执行计划中会有个Filter操作符

  • Window: 是指先对进行数据分类,而后在同一类中进行聚合处理

对于优化的方式有两种:一种是表达式本身是确定性,可以计算成常量;另一种是依赖前置操作符获得引用谓词,从而使得表达式计算成常量。

foo like '%ood' 表达式是利用前置操作符获得foo = 'good'的引用谓词进行计算
concat('hello', 'wold') 是个确定性表达式,而计算成常量

此优化可以把这些可约化的表达式的计算代码由原来的O(n)减少至O(1),从而减少了计算的成本。