SQL查询优化 | 青训营笔记

66 阅读3分钟

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

1. 大数据体系和SQL

SQL 接口 处理范围广 处理流程:

  • Parser string -> AST
  • Analyzer string -> logical plan(无算法) 检查绑定信息;检查数据类型
    left-deep tree:join保持在左侧
  • 查询优化:自由度
  • physical plan:执行计划子树->最小化网络数据传输
  • executor:多机并行

2. 常见的查询优化器

  • top-down optimizer: 由上往下
  • bottom-up optimizer:由下往上

1.RBO:规则优化计算

  • 本质
    1. 根据关系代数
    2. 启发式
    3. catalog
  • 主要目标为:
    • read data less and faster(I/O)
    • transfer data less and faster(Network)
    • process data less and faster
  • 优化规则
    1. 列裁剪
    2. 谓词下推(eg.where)join之前进行筛选
    3. 传递闭包 等价谓词可以在其他表中优先筛选
    4. runtime filter
      • min-max 范围紧密,特殊值影响
      • inlist 集合个数过多
      • bloom filter

2. CBO:模型估算代价

  • 流程
    1. 统计信息&推导规则
    2. 计算算子代价(CPU 内存网络I/O)
    3. 总和为执行计划代价
    4. 执行计划枚举
  • 统计信息
    scan算子:包括表分区&列;
    推导统计: 选择率(多少返回);基数(算子处理的行数)\
  1. 收集信息:
    • DDL实时统计;
    • 手动(信息不及时
      ANALYZE TABLE table_name COMPUTE STATISTICS FOR COLUMNS column-name1,column-name2
    • 动态采样
      SELECT count(*) FROM table_name
  2. 推导规则:选择率(概率)
    • AND:fs(a)fs(b): fs(a)*fs(b)
    • OR:fs(a)+fs(b)fs(a)fs(b): fs(a) + fs(b)-fs(a)*fs(b)
    • NOT:1fs(a): 1-fs(a)
    • "=":1. 不存在,为0; 2. 1NDV\frac{1}{NDV}
    • "<":
      1. <最小,=0; 2. >最大,=1;
      2. literalminmaxmin\frac{literal - min}{max - min}
  • 整体:cardinality(Filter)=card(A)selec(Filter)cardinality(Filter) = card(A) * selec(Filter)\
  • problem:均匀分布假设不符:①存在关联性②数据本身不均匀分布 ->直方图
  1. 执行计划
    1.贪心算法 2.动态规划:CPU效果(执行性能高)

3. 社区开源实践

  1. Apache Calcite:支持expression builder
  2. Calcite RBO:
    ad:优化规则多(A1)pattern 匹配子树,知道所有rule匹配完;
    dis:经验规则,无法最优;FilterIntoJoinRule
  3. Calcite CBO:volcanoPlanner
    • memo数据结构:求解子问题的最优,利用join描述,
    • 流程:AND/OR graph -> 该变条件,动态规划不断记录winner -> Top-down 遍历
    • 剪枝:减少子节点计算量 —— 如果子节点得到的大于原有得到的,则无需计算父节点cost

4. 前沿趋势

  1. 存储计算分离(单独扩容)
  2. 湖仓一体:原始数据当作文件——数据湖;query查询both湖仓
  3. 云原生:负载动态调节,该变计算节点
  4. DATA + AI:
    • AI4DB:
      • 自配置(智能调参、负载预测)
      • 自诊断和愈合
      • 自优化:代价估计;IBM优化器;索引、视图推荐
    • DB4AI:
      • 内嵌人工智能算法(MLSQL)
      • 内嵌机器学习框架(Spark)

Conclusion

  • 学习了SQL数据处理的总体流程,其中主要针对查询优化中的RBOCBO;
  • RBO有4中rule,包括:列裁剪、谓词下推、传递闭包、runtime filter;
  • CBO主要通过计算子节点的代价来进行动态规划,从而选择最优路径;
  • 选取Calcite作为查询优化的实例,RBO含有大量Rule,CBO中运用了memo进行记录AND/OR group,同时选用剪枝减少计算量,整体采用动态规划;
  • 前沿趋势包括存储计算分离等,其中与AI技术的结合可能成为查询优化的一个重要发展方向。