大数据第一天|青训营笔记

101 阅读4分钟

这是我参与【第四届青训营】笔记创作活动的第一天。在昨天,我通过录播的形式学习了第一部分SQL的查询优化,并通过查询资料,对于CBO和前沿趋势进行了以下整理:

1.CBO-概念

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

    • 执行计划的代价等于所有算子的执行代价之和
    • 通过RBO得到(所有)可能的等价执行计划
  • 算子代价: CPU,内存,磁盘I/O,网络I/O等代价

  • 和算子输入数据的统计信息有关:输入、输出结果的行数,每行大小....

    • 叶子算子Scan:通过统计原始表数据得到
    • 中间算子:根据定的推导规则,从下层算子的统计信息推导得到
  • 和具体的算子类型,以及算子的物理实现有关

  • 例子: Spark Join算子代价= weight * row_ count + (1.0 - weight)*size

CBO-统计信息
  • 原始表统计信息

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

    • \textcolor{red}{选择率(selectivity) }:对于某一个过滤条件,查询会从表中返回多大比例的数据

    • \textcolor{red}{基数(cardinality) }: 在查询计划中常指算子需要处理的行数

    • 在DDL里指定需要收集的统计信息,数据库会在数据写入时收集或者更新统计信息

      CREATE TABLE REGION(
          R_ REGIONKEY INT NOT NULL,
          R_ NAME CHAR(25) NOT NULL,
          R_ COMMENT VARCHAR(152)
      ) DUPLICATE KEY(R_ REGIONKEY)
      DISTRIBUTED BY HASH(R_REGIONKEY) BUCKETS 1
      PROPERTIES ("statsnis"="R NAM");
      
    • 手动执行 explain analyze statement,触发数据库收集或者更新统计信息

      ANALYZE TABLE table_name COMPUTE STATIS TICS FOR COLUMNS column-name1,column-name2,.....
      
    • 动态采样

      SELECT count(*) FROM table_name
      
  • Filter Selectivity

    • AND条件:fs(a AND b) = fs(a) * fs(b)

    • OR条件:fs(a OR b) = fs(a) +fs(b) - (fs(a) * fs(b))

    • NOT条件:fs(NOT a) = 1.0 - fs(a)

    • 等于条件(x = literal)

      • literal < min && literal > max: 0
      • 1/NDV
    • 小于条件(x < literal)

      • literal < min: 0
      • literal > max: 1
      • (literal - min) / (max-min)

CBO-执行计划枚举

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

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

  • 两表Hash Join:用小表构建哈希表——如何识别小表?

  • 多表Join:

    • 那种连接顺序是最优的?

    • 是否要对每种组合都探索?

      • N个表连接。仅仅是left-deep tree就有差不多N!种连接顺序
      • e.g.N = 10→总共3,628,800个连接顺序

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

CBO小结

  • CBO使用代价模型和统计信息估算执行计划的代价
  • CBO使用贪心或者动态规划算法寻找最优执行计划
  • 在大数据场景下CBO对查询性能非常重要

2.前沿趋势

  1. 引擎架构的进化

    • 创世!MapReduce!
    • 进击!Storm and Spark!
    • 绽放!Spark Streaming!
    • 无敌!Flink!
  2. Cloud(云原生)

    云原生是基于分布部署和统一运管的分布式云 ,以容器、微服务、DevOps等技术为基础建立的一套云技术产品体系,是一种新型技术体系,是云计算未来的发展方向。

    云原生应用也就是面向“云”而设计的应用,在使用云原生技术后,开发者无需考虑底层的技术实现,可以充分发挥云平台的弹性和分布式优势,实现快速部署、按需伸缩、不停机交付等。

  3. 湖仓一体

    湖仓一体是一种新型开放式架构,将数据湖和数据仓库的优势充分结合,它构建在数据湖低成本的数据存储架构之上,又继承了数据仓库的数据处理和管理功能。湖仓一体打通数据湖和数据仓库两套体系,让数据和计算在湖和仓之间自由流动,更能发挥出数据湖的灵活性,以及数据数据仓库的成长性。

  4. DATA+AI

    • AI4DB

      • 自配置

        • 智能调参
        • 负载预测,调度
      • 自诊断和自愈合:错误恢复和迁移

      • 自优化:

        • 统计信息估计
        • 代价估计
        • 学习型优化器
        • 索引,视图推荐
    • DB4AI

      • 内嵌人工智能算法(mysql,sqlflow)
      • 内嵌机器学习框架(SparkkML,Alink,dl-on-flink)

小结:

  • 大数据创业如火如荼,SQL查询优化器仍然是必不可少的一个重要组件
  • 引擎架构的进化,云原生,湖仓一体等对SQL的查询优化有新的要求和挑战
  • AI加持,学习型查询优化器在不断进化

个人思考

虽然属于一个初学者,在开课前仅仅只对数据库原理进行过浅薄的学习,但是在第一节课后也是有很大收获,了解了完整的优化过程,对于学过的知识有了更深的了解,希望自己能继续坚持。