Oceanbase查询改写:投影裁剪

Oceanbase通过投影裁剪规则优化查询性能,当查询语句涉及视图且存在大中间结果集时,会移除父查询未使用的视图列。此规则适用于视图含GROUPBY但无DISTINCT,且不为递归UNION的情况。改写过程包括检查和移除未导出至父查询的列,从而减少计算量。
摘要由CSDN通过智能技术生成
概述

当查询语句中包含视图查询时,执行过程中可能产生较大的中间结果集。为此,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标记。

  1. 视图查询如果为集合语句,则不能包含distinct语义,同时不能为递归union语句。

  1. 如果视图查询的select列只包含一列,则该列不能为常量表达式。

  1. 如果视图查询为集合语句,则集合子查询语句都应满足前述条件。

  1. 调用project_pruning函数对当前视图语句执行改写,该函数会遍历视图查询的select列表,然后判断其是否被导出至父查询。如果没有,则进一步调用check_need_remove函数判断其是否被用在集合查询的order by表达式中。如果没有在order by表达式中找到该列,则将其加入待移除列表,待循环结束后调用ObTransformUtils::remove_select_items函数移除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值