常见的查询优化器——CBO | 青训营笔记

330 阅读2分钟

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

第一节课「SQL Optimizer 解析」的内容主要包含 4 个方面:大数据体系和 SQL、常见的查询优化器、查询优化器的社区开源实践、SQL 相关的前沿趋势。这篇文章为常见的查询优化器 Cost-based Optimizer (CBO) 的介绍。

CBO

概念

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

    • 执行计划的代价等于所有算子的执行代价之和
    • 通过 RBO 得到(所有)可能的等价执行计划(非原地替换
  • 算子代价包含 CPU,cache misses,memory,disk I/O,network I/O 等代价

    • 和算子输入数据的统计信息有关:输入、输出结果的行数,每行大小等
      • 叶子算子 scan:通过统计原始表数据得到
      • 中间算子:根据一定的推导规则,从下层算子的统计信息推导得到
    • 和具体的算子类型,以及算子的物理实现有关
  • 使用动态规划枚举所有执行计划,选出执行代价最小的执行计划

统计信息

  • 基表统计信息

    • 表或者分区级别:行数、行平均大小、表在磁盘中占用了多少字节等
    • 列级别:min、max、num nulls、num、not nulls、num、distinct value(NDV)、histogram 等
  • 推导统计信息

    • 选择率(selectivity) :对于某一个过滤条件,查询会从表中返回多大比例的数据
    • 基数(cardinality) :基本含义是表的 unique 行数,在查询计划中常指算子需要处理的行数

执行计划枚举

  • 单表扫描:索引扫描(随机I/O) vs 全表扫描(顺序I/O)

    • 如果查询的数据分布非常不均衡,索引扫描可能不如全表扫描
  • Join 的实现: Hash Join vs SortMerge Join

  • 两表 Hash Join:用小表构建哈希表

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

个人总结

了解了查询优化器 CBO 的概念、统计信息与执行计划枚举的过程。

参考