数据库概论 (六)查询及优化

关系系统以及查询优化

查询检查

执行查询语句之前需要执行一些查询检查任务,提高代码的健壮性。

  • 有效性检查,查询的属性,数据表,是否存在,关系名是否有效
  • 视图转换,将视图转换为基本表的查询
    • image-20210103200609748
  • 安全性检查,检查执行查询的用户权限是否满足执行查询的要求
  • 完整性初步检查,检查所要查询的条件是否满足数据的类型要求。

检查完成之后会将数据库语句转换为对应的语法树。

查询算法优化

选择操作的实现算法

选择操作有多种实现方式,例如全表扫描法,索引法,散列法等等。

  1. 全表扫描法比较适合体较小的表,扫描起来代价不会太高,或者是对于那些要选取表中大部分元素的查询操作,全表扫描要比使用索引和散列更加廉价,因为没有查询或者计算散列下标的代价。
  2. 索引法或者是散列法,适合选择查询的属性列上有有索引,先通过索引找到对应的元组的主码,或者是通过hash散列函数算出元组的主码,再去取得数据。

连接操作的实现算法

select * from student, sc where student.sno=sc.sno

实现上述两个表的连接通常有这么几个办法:

  • 嵌套循环法 nested-loop
  • 排序合并法 sort-merge
  • 索引连接法 index-join

嵌套循环法

类似于里外双循环,将student表中的元组取出,将其Sno属性与sc中的所有元组的Sno属性进行对比,如果相等就进行连接,然后将连接的结果加入到结果集中,所以这里的代价为两表的大小之积:\(O(MN)\)

排序合并法

适合连接的诸表已经排好序的情况
排序-合并连接方法的步骤:

  1. 如果连接的表没有排好序,先对Student表和SC表按连接属性Sno排序;
  2. 取Student表中第一个Sno,依次扫描SC表中具有相同Sno的元组;
  3. 当扫描到Sno不相同的第一个SC元组时,返回Student表扫描它的下一个元组,再扫描SC表中具有相同Sno的元组,把它们连接起来;
  4. 重复上述步骤直到 Student 表扫描完
索引连接法
  1. 在SC表上建立属性Sno的索引,如果原来没有该索引;
  2. 对Student中每一个元组,由Sno值通过SC的索引查找相应的SC元组
  3. 把这些SC元组和Student元组连接起来, 循环执行2,3,直到Student表中的元组处理完为止
posted @ 2021-01-14 17:35  tanknee  阅读(195)  评论(0)    收藏  举报