- 作为普通用户 我们最多使用的就是DML对于DDL和DCL是数据库管理员该干的事情,那么普通的
select A1,A2,A3...An from R1,R2,R3...Rn where cond.
SQL查询是
-
通过词法分析和语法分析得到建立查询的分析树
-
根据分析树得到其关系代数表达式即一个物理查询计划,然后将该物理查询计划转化为一个等价的查询时间较小的计划
-
为每一个操作符(三类:一次单个元组 一元操作、单个关系 一元操作、多个关系 二元操作)选择实现算法并确定这些操作符的执行次序。之后就可以被执行引擎执行。
物理查询优化就是根据数据库中表的相关信息比如记录个数、记录长度、磁盘块个数等为每个关系代数操作选择例行程序,最后以这些例行程序作为基本步,确定执行顺序。可以看出物理查询的优化主要是例行程序的选择和例行程序的组合。(下面我们看看基本的关系代数操作符相关的算法即例行程序)
代数操作符的一趟算法
- 迭代器算法使用于单一元组一元运算和部分整个关系二元运算
- 选择操作
- 投影操作
- R join S
- 整个关系二元操作 包的并
- 去重操作
- 分组聚集
对于分组聚集来说我们需要在内存中保存所有的分组 及其聚集信息。比如对于MIN 则需要保存每个分组的最大值,当有新元组来时,首先看哪个分组,然后更新。
- 基于块的嵌套循环连接
这种实现连接的算法是按磁盘块来访问关系的,使用尽可能多的内存来存储磁盘块。假设内存中有M-2个页可以用来装载关系S.
For S中的Bs(S)/M-2 个M-2 个页大小的 总块
在读入内存的时候就对每个元组建立起数据结构比如排序 or散列 or索引
for R中的每个块b
将b读入内存
for b中的每一个元组 t
if t可以与之前读入内存的M-2S数据块中的元组 连接 输出到输出缓冲区
这样可以将通过查询结构将算法优化。