当前位置: 首页 > article >正文

视图查询中投影裁剪规则的原理和解析 | 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函数移除。

http://www.kler.cn/a/413400.html

相关文章:

  • 网络安全问题与大忌
  • SpringAI:Java 开发的智能新利器
  • css:项目
  • Android 使用Charles抓包显示Unknown
  • Vue Promise的使用,界面使用异步线程循环执行方法(模拟线程)
  • linux系统下如何将xz及ISO\img等格式压缩包(系统)烧写到优盘(TF卡)
  • 戴尔电脑安装centos7系统遇到的问题
  • c++趣味编程玩转物联网:基于树莓派Pico控制有源蜂鸣器
  • Linux之VMware安装以及centos7安装详细教程--图解
  • 七牛云AIGC内容安全方案助力企业合规创新
  • 【软件国产化】| Windows和Linux下文件名后缀是否区分大小写
  • 重构代码之将双向关联改为单向关联
  • C语言中常用的失败退出和成功返回
  • 利用 Watchtower 自动监听并更新正在运行的 Docker 容器
  • 如何选择合适的电网安全警示牌|防外破声光警示牌,确保电力设施安全
  • 深入理解SpringMVC(九)
  • matplotlib中文字体问题排查
  • 算法设计作业
  • AR商业化的“AI转身”
  • Unity类银河战士恶魔城学习总结(P141 Finalising ToolTip优化UI显示)
  • linux-centos-静态ipdocker安装使用
  • 网易博客旧文-----安卓界面代码例子研究(二)
  • 深度神经网络模型压缩学习笔记一:模型压缩概述
  • 量化交易系统开发-实时行情自动化交易-8.量化交易服务平台(一)
  • 企业OA管理系统:Spring Boot技术应用与优化
  • 校园交友/校园开黑/校园跑腿等多端系统如何进行二次开发?二次开发有哪些注意事项?