Bootstrap

视图查询中投影裁剪规则的原理和解析 | OceanBase 查询优化

背景

在SQL查询中使用视图查询时,执行中可能会产生的较多的中间结果集。为了优化这类查询的执行,OceanBase 引入了投影裁剪规则。能够识别出父查询中未实际使用的列,并将这些列从视图查询的select列表中剔除,进而提升整体查询的性能。

投影裁剪的基本原理

考虑如下情况:

SELECT c1 FROM (SELECT c1, c2 FROM t1 GROUP BY c1, c2) v

对于上述查询,并非所有的视图查询中的select列在父查询中都需要使用,因此可以进行改写,如下所示:

SELECT c1 FROM (SELECT c1 FROM GROUP BY c1, c2) v

投影裁剪的代码解析

投影裁剪规则的入口为ObTransformProjectPruning::transform_one_stmt,该函数会遍历查询语句的表信息中的表,然后对其中的视图表执行如下流程进行判断和改写:

  1. 调用check_transform_validity函数判断当前视图查询是否可以执行改写,需满足如下条件:
    1. 视图查询中包含group by表达式,且不包含distinct标记。
    2. 视图查询如果为集合语句,则不能包含distinct语义,同时不能为递归union语句。
    3. 如果视图查询的select列只包含一列,则该列不能为常量表达式。
    4. 如果视图查询为集合语句,则集合子查询语句都应满足前述条件。
  2. 调用project_pruning函数对当前视图语句执行改写,该函数会遍历视图查询的select列表,然后判断其是否被导出至父查询。如果没有,则进一步调用check_need_remove函数判断其是否被用在集合查询的order by表达式中。如果没有在order by表达式中找到该列,则将其加入待移除列表,待循环结束后调用ObTransformUtils::remove_select_items函数移除。
;