系统篇来讲的东西是数据库系统内部的东西是什么样的,如何实现的:
SQL语句
↓
Parser解析器(检查关键字、语法和访问权限)
↓
Operator evaluator(操作符评价器)
Executor
Optimizer
↓
得到能够可执行的语句
↓
事务处理(并发控制)
故障恢复
存储
↓
Parser解析器(检查关键字、语法和访问权限)
↓
Operator evaluator(操作符评价器)
Executor
Optimizer
↓
得到能够可执行的语句
↓
事务处理(并发控制)
故障恢复
存储
9 关系查询处理和查询优化
查询分析、查询检查、查询优化、查询执行
考点1
查询分析(词法分析、语法分析)
查询检查(语义分析、符号名转换、安全性检查、完整性初步检查)
查询优化(代数优化——语法树前序遍历叶子节点就是查询语句——转换成关系代数的查询树,加入选择投影连接等操作、物理优化)
查询执行(代码生成)
代数优化
- 输入是什么:查询树
- 输出是什么
- 逻辑是什么?
- 典型的查询树的启发式优化
- 选择运算应尽可能先做(下推到叶子节点)
- 把投影运算和选择运算同时进行
- 把投影同其前面或后面的双目运算结合起来(比如连接运算)——不用取出所有的列
- 把某些选择同在他前面要执行的笛卡尔积结合起来成为一个连接运算,连接特别是等值连接运算要比同样关系上的笛卡尔积省很多时间
- 找出公共子表达式——结果集缓存优化
物理优化——选择什么查询方法
9.1 关系数据库的查询处理
9.1.1 查询处理步骤
- 查询分析——词法分析+语法分析
输入:SQL语句
输出:语法树 - 查询检查——语义分析、视图消解、符号名转换、安全性检查、完整性初步检查
输入:语法树
输出:查询树 - 查询优化
输入:查询树
输出:(优化后的查询树——选择下推、投影与二目运算的同时做、连接)查询执行计划——在叶子节点增加用什么方式查询 - 查询执行
9.1.2 实现查询操作的算法示例
选择操作的实现
- 如果有多个选择条件,考虑分步骤查询的结果集大小(信息增益可还行哈哈哈,其实是叫选择率)也可分别查找做交集
- 全表扫描方法:代价是数据在磁盘中占的页数——与内存大小无关
- 索引扫描方法:通过索引找到数据在磁盘的哪个页上面——如果查找索引的开销是N,那么索引扫描方法的开销是N+1(如果需要查找的很多,考虑是否是连续存放,开销会相差很大)
- 索引方法:B+树索引、hash索引、聚簇索引——根据不同索引确定不同的N
- 范围查找比较多时用B+树,等值查询比较多时候用hash
主索引:顺序文件追加存放(大数据文件常用)
聚簇索引:文件的存放顺序是和某一个索引的顺序是一致的
– 查找的时候可以折半查找提高效率
外排序
student表有10个数据块,但是内存只能放3块数据块,这种限制下的一趟一趟排序,先分组使每块数据内部有序,IO20次,再竖着读,一次输出一页,再读进一页,循环,先保证输出的9个是有序的,哪行空了哪行读取下一页。最后一次读入排序完成之后不算输出,直接传送到用到它的地方了。
N块数据M块内存:IO次数是 N ∗ ( [ log M N ] ∗ 2 + 1 )