头图

在这里插入图片描述

代数优化改变查询语句中操作的次序和组合,但不涉及底层的存取路径。对于一个查询语句有许多存取方案,它们的执行效率不尽相同,因此,仅仅进行代数优化是远远不够的

物理优化就是要<font color="0000ff">选择高效合理的操作算法或存取路径以求得优化的查询计划</font>。具体方法有

  • 基于规则的启发式优化:启发式规则是指那些在大多数情况下都适用,但不是在每种情况下都是最好的规则
  • 基于代价估算的优化:使用优化器估算不同执行策略的代价,并选出具有最小执行代价的执行计划
  • 两者结合的优化方法

一:基于启发式规则的存取路径选择优化(定性)

(1)选择操作的启发式规则

A:小关系

对于小关系,使用<font color="0000ff">全表顺序扫描</font>,即使选择列上有索引

B:大关系

启发式规则有:

  • 对于选择条件是<font color="0000ff">“主码=值”</font>的查询,查询结果最多是一个元组,可以选择<font color="0000ff">主码索引</font>。一般的RDBMS会自动建立主码索引
  • 对于选择条件是<font color="0000ff">“非主属性=值”</font>的查询,并且选择列上有索引,同样要估算查询结果的元组数目,如果<font color="0000ff">选择率<10%</font>可以使用<font color="0000ff">索引扫描方法</font>,否则还是使用全表扫描
  • 对于<font color="0000ff">用AND连接的合取选择条件</font>,如果有涉及这些属性的组合索引,则优先采用<font color="0000ff">组合索引扫描方法</font>
  • 对于<font color="0000ff">用OR连接的析取选择条件</font>,一般使用全表顺序扫描

(2)连接操作的启发式规则

  • 如果2个表都已经按照连接属性排序,则选用<font color="0000ff">排序-合并算法
  • 如果一个表在连接属性上有索引,则可以选用<font color="0000ff">索引连接算法
  • 如果上面2个规则都不适用,其中一个表较小,则可以选<font color="0000ff">用hash join算法
  • 最后可以选用<font color="0000ff">嵌套循环算法,并选择其中较小的表,确切地讲是占用的块数(B)较少的表,作为外表(外循环的表)</font>(具体原因在第二节已经讲过)

二:基于代价估算的优化(定量)

(1)统计信息

基于代价的优化方法要计算各种操作算法的执行代价,它与数据库的状态密切相关。为此在数据字典中存储了优化器需要的统计信息(database statistics), 主要包括如下几个方面:

  • 基本表:该表的元组总数($N$)、元组长度($l$)、占用的块数($B$)、占用的溢出块数($BQ$)等
  • 基本表每个列:该列不同值的个数($m$)、该列最大值、最小值,该列上是否已经建立了索引,如果有,又是哪一种索引等
  • 索引:索引的层数($L$)、不同索引值的个数、索引的选择基数$S$等

(2)代价估算示例

  • 此部分了解即可,不做深入探究

A:全表扫描算法代价估算公式

在这里插入图片描述

B:索引扫描算法代价估算公式

在这里插入图片描述

C:嵌套循环算法代价估算公式

在这里插入图片描述

D:排序-合并连接算法的代价估算公式

在这里插入图片描述


快乐江湖
1 声望0 粉丝