大数据学习记录 | 青训营笔记

87 阅读1分钟

这是我参与「第四届青训营 」笔记创作活动的的第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个连接顺序

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

执行计划枚举-动态规划举例

image.png

image.png

image.png

image.png

image.png

image.png

此处列出了CBO最优的执行计划过程,每次筛选COST最少的进行连接,其他的舍弃即可。

CBO效果 TPC-DS Q25

对于如下sql

image.png

其left deep tree:

image.png 即8张表,16个查询条件在未开启CBO时的执行树的状态。以下是开启CBO:

image.png

对于数据量越小的表出现的位置离根节点越近

以下是有无CBO的性能差别:

image.png

image.png