0.写在前面
based on CMU 15-445/645 2020fall, Lecture #14~Lecture #15.
由于SQL语句是以声明式的方式给出要求,所以在执行的过程中有很多的优化空间。
Overview:
1)在第一个阶段进行SQL Rewriter(对于规则的优化),将一些常量进行累加计算等等。
2)接下来会把引用格式转换成内部的标识符,构建语法树(对应3)。(一个逻辑计划可能会对应许个物理计划)
3)最后Optimizer的作用就是选择代价最小的物理计划(基于代价的搜索)。
1:Heuristics / Rules策略
1.1 重写sql的优化 - PREDICATE PUSHDOWN
左右两个语法树最后产生的结果完全一致。但是效率会有很大差距。
右边先将enrolled表中grade=‘A’的tuple选出,在和student表做join操作,这会比直接join快非常多(如果enrolled中grade='A’的数量非常少)
从语法树上看我们把grade ='A’这个谓词push down,所以这种优化也叫谓词push down。
1.2 重写sql的优化 - PROJECTION PUSHDOWN
将投影规则下推到scan那一层,减少tuple的attribute。
1.3 谓词分解
将谓词分解成它们的最简单的形式,使其更容易让优化器移动它们。
1.4 表达式重写
重写那些运行中为常值的表达式。
1.5 忽略谓词
2:Cost Based 优化
Cost Based主要关注的是那些需要具体数据具体分析的优化(比如Join的顺序,scan的执行方法等)。对于Cost Based方法,其主要分为三个模块:
1)Cost Model:代价的评估策略
2)Statistics:统计信息的维护
3)Plan Enumeration:搜索最优的计划
2.1 SELECTION STATISTICS
假设数据分布均匀。
下图的例子是age=2:年龄为2的人在里面就占了百分之20.
2.2 SELECTION CARDINALITY
上述对数据的分布做出的假设是均匀分布,但实际的数据肯定为更加复杂。
维护一个直方图,来预估一个谓词会涉及到多少
如果不均匀的话,就以桶的形式使得每个高度尽可能接近。
2.3 Sampling
可以采样一个子集,然后通过部分估计总体。
2.4 Plan Enumeration
动态编程:如图所示,我们应该选择Cost最小的部分(黑色箭头)。
一条logical plan会对应许多的physical plan。
通过:
→ 枚举关系排序
→ 枚举连接算法选择
→ 列举访问方法选择
可以选择最优的策略,但是没有真正的 DBMS 这样做,其实更乱和复杂。
参考:
https://www.jianshu.com/p/7ae11dbec595
https://www.cnblogs.com/JayL-zxl/p/14597134.html