数据库系统概论第五版_第九章:关系查询处理和查询优化

目录

  • 关系查询处理和查询优化
    • 查询处理
      • 基本步骤(概念题)
      • 查询操作的示例
    • 查询优化(计算I/O次数题)
    • 代数优化(基于语法树的优化题)
    • 物理优化

关系查询处理和查询优化

本章主要涉及数据库的查询处理步骤和查询优化技术。查询优化可分为代数优化和物理优化。代数优化是对关系代数表达式的优化,物理优化是对存取路今后和底层算法的选择的优化。

查询处理

基本步骤(概念题)

关系数据库的查询处理分为查询分析、查询检查、查询优化、查询执行四个步骤。

  1. 查询分析:对语句进行扫描、词法分析,识别出关键字等,然后进行语法分析,检查其是否符合SQL语法规则。
  2. 查询检查:对查询语句进行语义检查,检查数据库、关系名、属性名等是否存在且有效;与此同时,进行视图消解,转化为对基本表的操作;根据用户权限和完整性约束对查询进行检查。检查通过后,将SQL转化为等价的关系代数表达式
  3. 查询优化:代数优化和物理优化。通过对关系代数的等价变换使查询变得高效,根据基于规则的、基于代价的、基于语义的方法进行存取路径和底层操作的算法的选择。
  4. 查询执行

查询操作的示例

选择操作:SELECT … FROM … WHERE <条件表达式>
—>全表扫描、索引扫描
连接操作:SELECT … FROM A, B WHERE …
—>嵌套循环排序-合并算法、索引连接、hash join算法(概念题)

查询优化(计算I/O次数题)

在使用SQL的时候,用户不必考虑如何最好的表达查询以获得较高的效率,系统可以比用户手动的优化做的更好。原因是:

  • 优化器可以从数据字典中获得很多统计信息,做出正确的估算。
  • 当物理数据改变时,系统可以自动的对查询进行重新优化。
  • 优化器可以考虑上百种优化方法。
  • 优化器中采用了很多复杂的技术。

查询的总代价 = I/O代价 + CPU代价 + 内存代价 + 通信代价

有选择和连接操作的时候,应该先做选择操作(索引或全表扫描)。

代数优化(基于语法树的优化题)

对关系代数进行等价变换,提高查询效率。

等价变换规则:

  • 连接运算、笛卡尔积运算的交换率(因为关系属性列的无序的!)
    数据库系统概论第五版_第九章:关系查询处理和查询优化_第1张图片

  • 连接、笛卡尔积的结合律(注意!!关系的前后顺序不能改变!!)
    数据库系统概论第五版_第九章:关系查询处理和查询优化_第2张图片
    结合的先后不同,其代价也是不同的。
    数据库系统概论第五版_第九章:关系查询处理和查询优化_第3张图片

  • 投影的串接定律
    数据库系统概论第五版_第九章:关系查询处理和查询优化_第4张图片

  • 选择的串接定律
    数据库系统概论第五版_第九章:关系查询处理和查询优化_第5张图片

  • 选择与投影的交换律
    数据库系统概论第五版_第九章:关系查询处理和查询优化_第6张图片

  • 选择与笛卡尔积的交换律
    数据库系统概论第五版_第九章:关系查询处理和查询优化_第7张图片

  • 选择与的分配律,选择与的分配律,选择对自然连接的分配律:我们要努力先进行选择操作再进行其他运算!!!
    数据库系统概论第五版_第九章:关系查询处理和查询优化_第8张图片

  • 投影与笛卡尔积的分配律
    数据库系统概论第五版_第九章:关系查询处理和查询优化_第9张图片

  • 投影与并的分配律
    数据库系统概论第五版_第九章:关系查询处理和查询优化_第10张图片

查询树的启发式优化:减少中间关系的元组数,元组大小

  • 选择运算尽可能先做
  • 投影和选择同时进行(及在一次扫描的过程中同时完成这两种操作)
  • 把投影前后的双目运算结合起来,避免重复扫描
  • 把先笛卡尔积在进行选择的命令合起来成为连接运算,避免重复扫描或减小中间结果集的规模
  • 找出公共子表达式,避免重复计算(例:用户频繁进行基于视图查询操作,而计算视图所需的时间远比从中间文件中取出视图所需是时间长,所以我们先将视图计算出存储在中间文件,用户对视图进行查询时我们直接从中间文件中取出视图)

简化的具体做法:利用上述的规则,尽可能的把选择操作移到树的叶端(向下移动)

物理优化

代数优化不涉及底层的存取路径。物理优化是要选择高效的操作算法与存取路径。

  • 基于规则的启发式优化:启发式规则是一种经验,在大多数情况下都适用,但也存在不适用的情况。
  • 基于代价估算的优化:优化器估算不同实行策略的代价并选出具有最小代价的
  • 两者结合的优化:先根据启发式规则选择较优的候选方案,减少代价估算的工作量,然后再根据代价估算优化方法较快的选择最优的方案。

选择操作的启发式规则:

  • 小关系:全表扫描(不管有没有索引)
  • 大关系:
    • 选择条件是主码=值:使用主码检索(因为查询结果最多只会有一个元组,且DBMS一般都会自动建立主码索引)
    • 非主属性=值选择列上有索引:若估算的元组数占比较小可使用索引扫描,否则还是全表扫描。
    • 非等值查询或范围查询且选择列上有索引:若估算的元组数占比较小可使用索引扫描,否则还是全表扫描。
    • AND连接的合取选择:优先使用组合索引(如果有的话);在某些条件上有索引,先进行索引扫描找到满足部分条件的元组,然后在这个基础上扫描满足剩下的条件的元组;其他情况:全表扫描
    • OR连接的析取选择条件:一般全表扫描

连接操作的启发式规则:

  • 两个表都按照连接属性排序:排序-合并算法
  • 在连接属性上有索引:索引连接算法
  • 其他情况:若一个表较小:hash join 算法
  • 嵌套循环算法,较小的表作为外循环的表

基于代价的优化中,优化器要统计很多的信息:
数据库系统概论第五版_第九章:关系查询处理和查询优化_第11张图片
数据库系统概论第五版_第九章:关系查询处理和查询优化_第12张图片
数据库系统概论第五版_第九章:关系查询处理和查询优化_第13张图片

你可能感兴趣的:(数据库,sql,database)