这是我参与【第四届青训营】笔记创作活动的第一天。在昨天,我通过录播的形式学习了第一部分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.前沿趋势
-
引擎架构的进化
- 创世!MapReduce!
- 进击!Storm and Spark!
- 绽放!Spark Streaming!
- 无敌!Flink!
-
Cloud(云原生)
云原生是基于分布部署和统一运管的分布式云 ,以容器、微服务、DevOps等技术为基础建立的一套云技术产品体系,是一种新型技术体系,是云计算未来的发展方向。
云原生应用也就是面向“云”而设计的应用,在使用云原生技术后,开发者无需考虑底层的技术实现,可以充分发挥云平台的弹性和分布式优势,实现快速部署、按需伸缩、不停机交付等。
-
湖仓一体
湖仓一体是一种新型开放式架构,将数据湖和数据仓库的优势充分结合,它构建在数据湖低成本的数据存储架构之上,又继承了数据仓库的数据处理和管理功能。湖仓一体打通数据湖和数据仓库两套体系,让数据和计算在湖和仓之间自由流动,更能发挥出数据湖的灵活性,以及数据数据仓库的成长性。
-
DATA+AI
-
AI4DB
-
自配置
- 智能调参
- 负载预测,调度
-
自诊断和自愈合:错误恢复和迁移
-
自优化:
- 统计信息估计
- 代价估计
- 学习型优化器
- 索引,视图推荐
-
-
DB4AI
- 内嵌人工智能算法(mysql,sqlflow)
- 内嵌机器学习框架(SparkkML,Alink,dl-on-flink)
-
小结:
- 大数据创业如火如荼,SQL查询优化器仍然是必不可少的一个重要组件
- 引擎架构的进化,云原生,湖仓一体等对SQL的查询优化有新的要求和挑战
- AI加持,学习型查询优化器在不断进化
个人思考
虽然属于一个初学者,在开课前仅仅只对数据库原理进行过浅薄的学习,但是在第一节课后也是有很大收获,了解了完整的优化过程,对于学过的知识有了更深的了解,希望自己能继续坚持。