PolarDB-X接收到一条SQL后的执行过程大致如下:

语法解析器(Parser)将SQL文本解析成抽象语法树(AST)。

语法树被转化成基于关系代数的逻辑计划。

优化器(Optimizer)对逻辑计划进行优化得到物理计划。

执行器(Executor)执行该计划,得到查询结果并返回给用户。

本章将会介绍查询优化器的基本原理,包含如下几个方面:

关系代数算子。

查询改写(RBO阶段)。

查询计划枚举(CBO阶段)。

关系代数算子

一条SQL查询在数据库系统中通常被表示为一棵关系代数算子组成的树,有如下场景的算子:

Project:用于描述SQL中的SELECT列,包括函数计算。

FIlter:用于描述SQL中的WHERE条件。

JOIN:用于描述SQL中的JOIN,其对应的物理算子有HashJoin、 BKAJoin、Nested-Loop Join、SortMergeJoin。

Agg:用于描述SQL中的Group By及聚合函数,其对应的物理算子有HashAgg、SortAgg。

Sort:用于描述SQL中的Order By及Limit,其对应的物理算子有TopN、MemSort。

LogicalView:用于描述PolarDB-X下发至RDS MySQL或PolarDB MySQL的SQL,其内部可能包含一个或多个逻辑算子。

Gather:代表从多个数据流汇集数据的操作,通常出现在LogicalView之上(若开启并行执行,则并行优化步骤会将其上拉)。

例如,对于如下查询SQL(修改自TPC-H Query 3):

SELECT l_orderkey,sum(l_extendedprice*(1-l_discount))AS revenue

FROM CUSTOMER,ORDERS,LINEITEM

WHERE c_mktsegment='AUTOMOBILE'

andc_custkey=o_custkey

andl_orderkey=o_orderkey

ando_orderdate

andl_shipdate>'1995-03-13'

GROUP BY l_orderkey;

通过如下EXPLAIN命令看到PolarDB-X的执行计划:

HashAgg(group="l_orderkey",revenue="SUM(*)")

HashJoin(condition="o_custkey = c_custkey",type="inner")

Gather(concurrent=true)

LogicalView(tables="ORDERS_[0-7],LINEITEM_[0-7]",shardCount=8,sql="SELECT `ORDERS`.`o_custkey`, `LINEITEM`.`l_orderkey`, (`LINEITEM`.`l_extendedprice` * (? - `LINEITEM`.`l_discount`)) AS `x` FROM `ORDERS` AS `ORDERS` INNER JOIN `LINEITEM` AS `LINEITEM` ON (((`ORDERS`.`o_orderkey` = `LINEITEM`.`l_orderkey`) AND (`ORDERS`.`o_orderdate` < ?)) AND (`LINEITEM`.`l_shipdate` > ?))")

Gather(concurrent=true)

LogicalView(tables="CUSTOMER_[0-7]",shardCount=8,sql="SELECT `c_custkey` FROM `CUSTOMER` AS `CUSTOMER` WHERE (`c_mktsegment` = ?)")

用树状图表示如下:

左边的LogicalView实际包含了ORDERS和LINEITEM两张表的JOIN。EXPLAIN结果中LogicalView的SQL属性也体现了这一点。

查询改写(RBO)

查询改写(SQL Rewrite)阶段输入为逻辑执行计划,输出为逻辑执行计划。这一步主要应用一些启发式规则,是基于规则的优化器(Rule-Based Optimizer,简称RBO),所以也常被称为RBO阶段。

查询改写这一步的主要有如下功能:

子查询去关联化(Subquery Unnesting)

子查询去关联化是将含有关联项的子查询(关联子查询)表示为SemiJoin或类似的算子,便于后续的各种优化处理,例如下推到MySQL或在PolarDB-X层选择某种算法执行。

在如下例子中IN子查询转化为SemiJoin算子,并最终转化成SemiHashJoin物理算子由PolarDB-X进行执行:

>explainselectidfromt1whereidin(selectidfromt2wheret2.name='hello');

SemiHashJoin(condition="id = id",type="semi")

Gather(concurrent=true)

LogicalView(tables="t1",shardCount=2,sql="SELECT `id` FROM `t1` AS `t1`")

Gather(concurrent=true)

LogicalView(tables="t2_[0-3]",shardCount=4,sql="SELECT `id` FROM `t2` AS `t2` WHERE (`name` = ?)")

算子下推

算子下推是非常关键的一步,PolarDB-X内置了如下算子的下推优化规则:谓词下推或列裁剪:将Filter及Project算子下推至MySQL执行,过滤掉不需要的行和列。

JOIN Clustering:将JOIN按照拆分方式及拆分键相等进行重排和聚簇,方便下一步的JOIN下。

JOIN下推:对于符合条件的JOIN,将其下推至MySQL执行。

Agg下推:将聚合(Agg)拆分为FinalAgg和LocalAgg两个阶段,并将LocalAgg下推至MySQL。

Sort下推:将排序(Sort)拆分为MergeSort和LocalSort两个阶段,并将LocalSort下推至MySQL。

更多关于查询下推的信息,请参见查询改写与下推。

查询计划枚举(CBO)

经过查询改写阶段的逻辑执行计划会被输入到查询计划枚举(Plan Enumerator),输出一个最终的物理执行计划。

查询计划枚举在多个可行的查询计划中,根据预先定义的代价模型,选择出代价最低的一个。与查询改写阶段不同,在查询计划枚举中,规则可能产生更好的执行计划,也可能产生更差的执行计划,我们会根据前后的代价相比较来选择出较优的那个,因此这也被称为基于代价的优化(Cost-based Optimizer,简称CBO)。

其核心组件有以下几个部分:

统计信息(Statistics)

基数估计(Cardinality Estimation)

转化规则(Transform Rules)

代价模型(Cost Model)

计划空间搜索引擎(Plan Space Search Engine)

逻辑上,CBO的过程包括如下几个步骤:

搜索引擎利用转化规则,对输入的逻辑执行计划进行变换,构造出物理执行计划的搜索空间。

之后,利用代价模型对搜索空间中的每一个执行计划进行代价估计,选出代价最低的物理执行计划。

而代价估计的过程离不开基数估计,它利用各个表、列的统计信息,估算出各算子的输入行数、选择率等信息,提供给算子的代价模型,从而估算出查询计划的代价。

mysql cbo优化器_查询优化器介绍 - PolarDB-X 云原生分布式数据库 - 阿里云相关推荐

  1. centos7镜像加速_虚拟机 Linux CentOS7 安装Docker 详解:使用 阿里云Yum源;附加云镜像加速器...

    Docker 要求 CentOS 系统的内核版本高于 3.10 ,先检查一下,如内核版本不符合,不建议参考该贴安装!(CentOS版本 大于7.0以上版本,一般都可以:建议先查询系统内核版本) 如系统 ...

  2. 阿里云ECS代理访问阿里云RDS MySQL数据库

    一.前言 阿里云RDS数据白名单一般只对内部的服务器开放,一般不会开放给外网直接访问,有时开发需要直接访问RDS数据库,平时我们使用的网络都是动态公网IP,经常会变化,设置白名单相对繁琐一点.想了一个 ...

  3. MySQL优化器_MySQL查询优化器

    MySQL优化器 MySQL架构图 讲到MySQL,就绕不开他的架构图.MySQL是一个经典的C/S架构.服务器这边分两层:第一层是Server层,第二层是存储引擎.Server层处理主要的业务操作流 ...

  4. mysql cbo优化器_Oracle的优化器(Optimizer) (CBO优化) 分享

    Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执行 计划去执行.分析语句的执行计划的工作是由优化器(Optimiz Oracle的优化器(Optimizer) (CBO优化) ...

  5. webgl 着色器_“着色器”是什么意思? 如何使用HTML5和WebGL创建它们

    webgl 着色器 本文是Microsoft的Web开发技术系列的一部分. 感谢您支持使SitePoint成为可能的合作伙伴. 您可能已经注意到,去年我们第一次谈论了babylon.js ,最近我们发 ...

  6. ppt复制切片器_切片器化繁为简,盘它 !

    与Power BI 相伴多年的时光里(不知牺牲了我多少游戏娱乐的时间),Power BI 越来越丰富的功能渐渐改变了我们使用Power BI报告的方式,如书签.按钮和选择等功能~~现在,大多数业务用户 ...

  7. 【项目问题】PM2管理器运行报错: Error: bind EADDRINUSE null:8360(阿里云服务器)

    本人后端是使用thinkjs项目创建的,npm run compile 编译后上传到服务器,发现报错:Error: bind EADDRINUSE null:8360 第一步:查看运行日志,报错原因是 ...

  8. RadonDB - 基于MySQL的云原始分布式数据库,用于构建全局的,可扩展的云服务

    RadonDB是开源的云原生MySQL数据库,用于构建全局的,可扩展的云服务 概观 RadonDB是一个开源的,云原生的MySQL数据库,可实现无限的可扩展性和性能. 什么是RadonDB? Rado ...

  9. 沃特玛采集均衡模块_云原生在京东丨云原生时代下的监控:如何基于云原生进行指标采集?...

    从 Kubernetes 成为容器管理领域的事实标准开始,基于云原生也就是基于 Kubernetes 原生.在云的体系下,基础硬件基本上都被抽象化.模糊化,硬故障需要人为干预的频次在逐渐降低,健康检查 ...

最新文章

  1. loadrunner 调用java_LoadRunner调用Java程序—性能测试
  2. winforms 动态画折线 不用chart_QT charts 动态刷新曲线图
  3. java 静态方法上的泛型
  4. 中国十大名画,你知道几幅?(附高清全图)
  5. Properties作为Map集合的特有方法
  6. linux 下 MySQL卸载和安装
  7. java三态_Java中对象的三种状态
  8. 'display','position'和'float'相互关系
  9. HiTSDB 时序数据库技术架构和产品解析
  10. simpledateformat格式_为什么日期格式化时必须有使用y表示年,而不能用Y?
  11. [iOS]UIButton内、外边距设置
  12. word打开html显示空白,电脑打开Word文档内容显示不全或显示空白怎么办
  13. 启用邪恶-使用XmlSerializer和一些魔术在Xml中隧道化Xml
  14. 大学计算机应用教程实验步骤,大学计算机基础实验教程--详细介绍
  15. 工作一到五年的Java程序员该如何提升自己?
  16. Codeforces gym 2013-2014 Samara SAU ACM ICPC Quarterfinal Qualification Contest
  17. 《802.11无线网络权威指南》摘录
  18. Spring 源码分析(一) —— 迈向Spring之路(转载)
  19. php zip解压原理,PHP ZipArchive实现解压缩zip文件
  20. 小学奥数思维训练题(十一)

热门文章

  1. Magicodes.IE 3.0重磅设计畅谈
  2. [Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本
  3. 如何编写高性能的C#代码(四)字符串的另类骚操作
  4. 打不死我的,终将使我强大!DevOps黑客马拉松参赛心得
  5. [译].Net中的内存-什么分配在了哪里
  6. .NET Core 微服务之Polly熔断策略
  7. Skywalking部署常见问题以及注意事项
  8. .NET Core实践系列之SSO-跨域实现
  9. 使用 mono 编译 .NET Standard 应用
  10. 全文索引 - Pomelo.EFCore.MySql