概述
当查询语句中包含视图查询时,执行过程中可能产生较大的中间结果集。为此,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,该函数会遍历查询语句的表信息中的表,然后对其中的视图表执行如下流程进行判断和改写:
- 调用check_transform_validity函数判断当前视图查询是否可以执行改写,需满足如下条件:
- 视图查询中包含group by表达式,且不包含distinct标记。
- 视图查询如果为集合语句,则不能包含distinct语义,同时不能为递归union语句。
- 如果视图查询的select列只包含一列,则该列不能为常量表达式。
- 如果视图查询为集合语句,则集合子查询语句都应满足前述条件。
- 调用project_pruning函数对当前视图语句执行改写,该函数会遍历视图查询的select列表,然后判断其是否被导出至父查询。如果没有,则进一步调用check_need_remove函数判断其是否被用在集合查询的order by表达式中。如果没有在order by表达式中找到该列,则将其加入待移除列表,待循环结束后调用ObTransformUtils::remove_select_items函数移除。