基本内容
一、查询步骤,类似于编译原理中高级语言的编译过程
基于关系代数内容
- 查询分析:词法分析,语法分析,语义分析
- 查询检查:安全性、完整性、有效性检查
- 建立查询内部表示(语法树)
- 查询优化
- 查询执行
二、选择操作实现
-
顺序扫描法:
- 简单按照关系中元组的物理位置顺序扫描,选择出满足条件的元组,平均搜索代价:总行数/2
-
二分查找法:
- 选择条件是p = ‘’,选择的属性是有序且以此属性值相等比较,适合使用二分查找法,平均搜索代价:log(总行数)
- 如果选择是作用在非有序属性上,那么代价也会增加
-
索引查找法:
- 常见有B+树索引和Hash索引
-
复合选择,逻辑合取,∩
- 选择条件p AND q。使用多个索引,在多个属性上建立索引,然后分别查找,取交集
-
复合选择,逻辑析取,∪
- 选择条件p OR q。若两个条件作用属性都有索引可以优化,取并集,否则只能顺序扫描法
三、连接操作实现,连接
连接操作是数据库操作中最复杂的,最坏情况是笛卡尔积
- 嵌套循环法,最基础的方法
- 索引嵌套循环法,利用索引减少查找时间,从而减少循环次数
- 排序合并法
- 对两个表连接属性进行排序,采用两个指针,指针一不动,指针二向下扫描,扫描到相同的元素进行连接,扫描到不同的元素,指针二下移。两个表都只用扫描一次
- 散列连接法
- 将两个表的连接属性分别散列到一个Hash数组中,然后对散列到同一位置的元素进行连接
四、投影操作实现
如果投影列包含主键,直接投影,否则需要进行消除重复的操作
五、查询优化
特点:
- 优化器可以从数据字典中获取统计信息,程序员编程时则不能使用
- 如果数据库物理结构变化了,那么DBMS可以自动重新优化
5.1 代数优化
基于关系代数对查询语句进行优化,不涉及底层的存储
策略:
- 尽早执行选择操作,减少中间关系,在语法树中,选择操作移动到叶端
- 投影操作和选择操作同时做,避免重复扫描
- 将投影操作与前后的双目运算符结合,减少扫描关系的遍数
- 选择和笛卡尔积结合成自然连接
- 执行连接操作前,可以对连接属性进行排序或者建立索引
- 找出公共子表达式
5.2 基于存储路径优化
合理选择各种操作的存储路径,涉及底层物理存储实现。
5.2.1选择操作启发式规则,选择操作实现
对于小关系,直接使用顺序扫描法
对于大关系
条件是“主键=值”,由于选择元组少,使用主键索引
条件是AND合取,优先使用组合索引法
条件是OR析取,一般使用全表扫描法
其余,根据选择元组百分比,若较多使用顺序扫描法,否则使用主键索引
5.2.2连接操作启发式规则,连接操作实现,连接
和连接操作实现一样,有排序合并、索引连接、Hash连接法
5.3 基于代价评估优化
访问存储器代价、存储代价、计算代价、内存使用代价、通信代价
数据字典中记录的统计信息
- 表
- 元组总数、元组长度、占用块数、占用溢出块数
- 列
- 列不同值的个数、选择率、最值、索引类型
- 索引
- 索引层数、不同索引值个数、叶节点个数