Oceanbase查询改写:投影裁剪

2024年 5月 7日 60.7k 0

概述

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

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论