这是我参与「第四届青训营 」笔记创作活动的的第1天
SQL:流行,简单,接口,希望用SQL处理所有大数据
1.SQL的处理流程:
经过四个组件处理:Parsar,Analyzer,Optimize(优化器处理,重点),Executer(执行,处理数据,返回结果给用户)
- parser:输入字符串string,输出AST(抽象语法树) 过程中经过两个步骤:词法分析,语法分析
- Analyzer: left-deep tree中join算子的右边必须是scan,两者不能调换顺序
- 查询优化(重点): 由于SQL是一种声明式语言,用户只描述做什么,没有告诉数据库怎么做,因此数据库的操作空间很大,有优化空间,所以叫查询优化,为了找到一个正确且执行代价最小的物理执行计划。 NP:没法很好的求最优解
2.常见的查询优化器
什么是查询优化器:
数据库主要由三部分组成,分别是解析器、优化器、执行引擎,其中优化器是数据可中用于把关系表达式转换成执行计划的核心组件,很大程度上决定了一个系统的性能。
查询优化器在很大程度上决定了一个数据库系统的性能,优化器的作用就好比找到两点之间的最短路径。
(1)按遍历树的顺序划分:
(2)根据优化方法划分:
3.RBO(基于规则的优化器)
根据优化规则对关系表达式进行转换,这里的转换是说一个关系表达式经过优化规则后会变成另外一个关系表达式,同时原有表达式会被裁剪掉,经过一系列转换后生成最终的执行计划。
RBO中包含了一套有着严格顺序的优化规则,同样一条SQL,无论读取的表中数据是怎么样的,最后生成的执行计划都是一样的。同时,在RBO中SQL写法的不同很有可能影响最终的执行计划,从而影响脚本性能。
(1)关系代数:
(2)优化规则:
优化I/O:希望读更少数据并更快
优化网络
优化cpu内存:处理数据更少更快
SELECT pv.siteld,user.name
:连接两张表,pv表和user表,
FROM pv JOIN user
ON pv.siteld=user.siteld AND pv.userld=user.id
连接规则是pv.siteld=user.siteld并且pv.userld=user.id
WHERE user.siteld>123
连接的时候过滤条件user.siteld>123
黄色的是连接条件
优化规则1:列裁剪
把用不到的列去掉,减少i/o或内存的占用,并且为后续的优化带来便利(尽可能减少数据)
优化从上往下扫描,把需要列的信息计算出来,往下传递相加,scan是扫描
经过列裁剪,pv只扫描siteld和userld两列,user只扫描id,sitele,name三列,速度更快
优化规则2:谓词下推
把谓词下推,尽早过滤数据
优化规则3:传递闭包(更高级更难实现)
根据表达式的等价关系加上过滤条件推导出新的过滤条件
可以创造出新filter
优化规则4:runtime filter
提早过滤左边的数据,再进行join
4.CBO(基于代价的优化器)
I/O:把数据从磁盘读入内存时所需代价(Select重点指标)
CPU:处理内存中数据所需的代价(排序(sort)、连接(join)操作)
网络资源:网络资源是指那些用了dblink的分布式目标SQL,CBO在解析该类目标SQL时知道在实际执行时所需要的的数据并不在本地数据库中(需要远程数据库取数),便会将网络资源消耗折算成对等的I/O资源消耗再进行估算。
动态采样:执行SQL所涉及对象(表、索引等)没有被分析、统计过,Oracle就会使用动态采样,动态的收集表和索引上的一些数据信息,但这些统计信息不会记录在视图中,只在硬解析时才会使用动态采样。
根据优化规则对关系表达式进行转换,这里的转换是说一个关系表达式经过优化规则后会生成另外一个关系表达式,同时原有表达式也会保留,经过一系列转换后会生成多个执行计划,然后CBO会根据统计信息和代价模型(Cost Model)计算每个执行计划的Cost,从中挑选Cost最小的执行计划。由上可知,CBO中有两个依赖:统计信息和代价模型。统计信息的准确与否、代价模型的合理与否都会影响CBO选择最优计划。
5.社区开源实践
Apache Calcite:查询优化器,解析SQL进行优化得到执行计划
6.个人总结: 通过这节课,我主要掌握了大数据体系,SQL的处理流程,查询优化器是什么,主流的查询优化器RBO,CBO以及他们的优化规则,开源社区实践,大数据的前沿趋势