代数优化改变查询语句中操作的次序和组合,但不涉及底层的存取路径。对于一个查询语句有许多存取方案,它们的执行效率不尽相同,因此,仅仅进行代数优化是远远不够的
物理优化就是要<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)代价估算示例
- 此部分了解即可,不做深入探究
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。