这是我参与「第四届青训营 」笔记创作活动的第1天

138 阅读5分钟

第一节:SQL查询优化器浅析

01.大数据体系和SQL

1.1 SQL的处理流程

SQL->Parser->Analyzer->Optimizer->Executor

1.2查询优化

·SQL是一种声明式语言,用户只描述做什么,没有告诉数据库怎么做

·目标:找到一个正确且执行代价最小的物理执行计划

·查询优化器是数据库的大脑,最复杂的模块,很多相关问题都是NP的

·一般SQL越复杂,Join的表越多,数据量越大,查询的意义也就越大。

1.3 Physical Plan 和Executor

·Plan Fragment:执行计划子树

目标:最小化网络数据传输 利用上数据的物理分布(数据亲和性)

增加Shuffle算子

·Executor

单机并行:cache,pipeline,SIMD

多机并行:一个fragment对应多个实例

1.4小结

·SQL需要依次经过Parser,Analyzer,Optimizer和Executor的处理

·查询优化器是数据库的大脑,在大数据场景下对查询性能至关重要。

·查询优化器需要感知数据分布,充分利用数据的亲和性。

·查询优化器按照最小化网络数据传输的目标把逻辑计划拆封成多个物理计划片段。

02.常见的查询优化器

分类:RBO和CBO

2.1查询优化器分类

·Top-down Optimizer

从目标输出开始,由上往下遍历计划树,找到完整的最优执行计划

eg:Volcano、SQLServer

·Bottom-up Optimizer

从0开始,由下往上遍历计划树,找到完整的最优执行计划

eg:System R;PostgreSQL ,IBM DB2

·RBO: 根据关系代数等价语义,重写查询

基于启发式规则

会访问表的元信息,不会涉及具体的表数据 ·CBO

使用一个模型估算执行计划的代价,选择代价最小的执行计划。

1.3 RBO的优化方法

RBO-列裁剪

RBO-谓词下推

RBO-传递闭包

RBO-Runtime Filter

1.4 RBO小结

·主流RBO实现一般都有几百条基于经验归纳得到的优化规则。

·优点:实现简单,优化速度快

·缺点:不保证得到最优的执行计划。选择错误的一边构建哈希表容易导致内存溢出。

1.5 CBO-概念

·使用一个模型估算执行计划的代价,选择最小执行计划。

执行计划的代价等于所以算子的执行代价之和。

通过RBO得到(所有)可能的等价执行计划。

·算子代价:cpu,内存,磁盘i/o,网络i/o等代价

算子代价和算子输入数据的统计信息有关,叶子算子:通过统计原始表数据得到,中间算子:根据一定的推导规则从下层算子的统计信息中得到。

统计信息+推导规则--》计算算子代价--》计算执行计划代价--》执行计划枚举

1.6.1 CBO-统计信息

·原始表统计信息

表或者分区级别:行数、行平均大小、表在磁盘中占用了多少字节等。

·推导统计信息

选择率:对于某一个过滤条件,查询会从表中返回多大比例的数据

基数:在查询计划中常指算子需要处理的行数。

1.6.2 CBO-统计信息的收集方式

·在DDL里指定需要收集的统计信息,数据库会在数据库写入时收集或者更新统计信息。

·手动执行explain analyze statement,触发数据库收集或者更新统计信息。

·动态采样

1.6.3 CBO-执行计划枚举

·单表查询:索引扫描(随机I/O) vs.全表扫描(顺序I/O)

如果查询的数据分布非常不均衡,索引扫描可能不如全表扫描。

·通常使用贪心算法或者动态规划选出最优的执行计划。

·关闭CBO:

1.Shuffle数据量太大

2.执行效率差

·开启CBO:

1.减少了90%的Shuffle数据量

  1. 3.4倍的加速比

1.6.4 CBO效果

·16个查询在CBO下有更好的执行性能

·大概一半的查询都没显示出性能变化,这是因为CBO能为这些查询找到最优执行计划。

1.6.7 CBO小结

·CBO使用代价模型和统计信息估算执行计划的代价

·CBO使用贪心或者动态规划算法寻找最优执行计划

·大数据场景下CBO对查询性能非常重要

1.7 小结

·主流RBO实现一般都有几百条基于经验归纳得到的优化规则。

·RBO实现简单,优化速度快

·RBO不保证得到最优的执行计划

·CBO使用代价模型和统计信息估算执行计划的代价

·CBO使用贪心算法或者动态规划算法寻找最优执行计划

·大数据场景下CBO对查询性能非常重要

3.社区开源实践

3.1Apache Calcite概览

·One size fits all:统一的SQL查询引擎

·模块化,插件化,稳定可靠

·支持异构数据模型

关系型、半结构化、流式、地理空间数据

·地理空间数据

·内置RBO和CBO

3.2 Calcite RBO

·HepPlanner

优化规则

Pattern:匹配表达子树

等价变化:得到新的表达式

内置有100+优化规则

四种匹配规则

遍历所有的rule,直到没有rule可以被触发。

优化速度快,实现简单,但是不保证最优。

·VolcanoPlanner

基于Volcano/Cascade框架

成本最优假设

Memo:存储候选执行计划

Group winner:目前的最优计划

VolcanoPlanner----剪枝:减少搜索空间

3.3小结

·主流的查询优化器都包含RBO和CBO

·Apache Calcite是大数据领域很流行的查询优化器

·Apache Calcite RBO定义了许多优化规则,使用pattern匹配子树,执行等价变换

·Apache Calcite CBO基于Volcano/Cascade框架

·Volcano/Cascade的精髓:Memo、动态规划、剪枝