这是我参与「第四届青训营 」笔记创作活动的的第7天 前言:上节记录了sql Optimizer中常见的CBO查询优化器中:统计信息、统计信息的收集方式以及统计信息的推导规则,本节继续记录CBO中的执行计划和效果,并对CBO进行总结。
CBO-执行计划枚举
枚举CBO的执行计划,需要考虑到如下内容:
-
单表扫描:索引扫描(随机I/O) vs.全表扫描(顺序I/O)
√ 如果查询的数据分布非常不均衡,索引扫描可能不如全表扫描
-
Join 的实现: Hash Join vs. SortMerge Join
√ 两表Hash Join:用小表构建哈希表——如何识别小表?
-
多表Join:
√ 哪种连接顺序是最优的?
√ 是否要对每种组合都探索?
√ N个表连接,仅仅是
left-deep tree就有差不多N!种连接顺序。例如:N= 10->总共3,628,800个连接顺序
通常使用贪心算法或者动态规划选出最优的执行计划
执行计划枚举-动态规划举例
此处列出了CBO最优的执行计划过程,每次筛选COST最少的进行连接,其他的舍弃即可。
CBO效果 TPC-DS Q25
对于如下sql
其left deep tree:
即8张表,16个查询条件在未开启CBO时的执行树的状态。以下是开启CBO:
对于数据量越小的表出现的位置离根节点越近
以下是有无CBO的性能差别: