您的位置:首页 > 数据库

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

2021-01-14 17:35 746 查看

关系系统以及查询优化

查询检查

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

  • 有效性检查,查询的属性,数据表,是否存在,关系名是否有效
  • 视图转换,将视图转换为基本表的查询
  • 安全性检查,检查执行查询的用户权限是否满足执行查询的要求
  • 完整性初步检查,检查所要查询的条件是否满足数据的类型要求。
  • 检查完成之后会将数据库语句转换为对应的语法树。

    查询算法优化

    选择操作的实现算法

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

    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表中的元组处理完为止
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: