@
目录
代数优化改变查询语句中操作的次序和组合,但不涉及底层的存取路径。对于一个查询语句有许多存取方案,它们的执行效率不尽相同,因此,仅仅进行代数优化是远远不够的
物理优化就是要选择高效合理的操作算法或存取路径以求得优化的查询计划。具体方法有
- 基于规则的启发式优化:启发式规则是指那些在大多数情况下都适用,但不是在每种情况下都是最好的规则
- 基于代价估算的优化:使用优化器估算不同执行策略的代价,并选出具有最小执行代价的执行计划
- 两者结合的优化方法
一:基于启发式规则的存取路径选择优化(定性)
(1)选择操作的启发式规则
A:小关系
对于小关系,使用全表顺序扫描,即使选择列上有索引
B:大关系
启发式规则有:
- 对于选择条件是“主码=值”的查询,查询结果最多是一个元组,可以选择主码索引。一般的RDBMS会自动建立主码索引
- 对于选择条件是“非主属性=值”的查询,并且选择列上有索引,同样要估算查询结果的元组数目,如果选择率<10%可以使用索引扫描方法,否则还是使用全表扫描
- 对于用AND连接的合取选择条件,如果有涉及这些属性的组合索引,则优先采用组合索引扫描方法
- 对于用OR连接的析取选择条件,一般使用全表顺序扫描
(2)连接操作的启发式规则
- 如果2个表都已经按照连接属性排序,则选用排序-合并算法
- 如果一个表在连接属性上有索引,则可以选用索引连接算法
- 如果上面2个规则都不适用,其中一个表较小,则可以选用hash join算法
- 最后可以选用嵌套循环算法,并选择其中较小的表,确切地讲是占用的块数(B)较少的表,作为外表(外循环的表)(具体原因在第二节已经讲过)
二:基于代价估算的优化(定量)
(1)统计信息
基于代价的优化方法要计算各种操作算法的执行代价,它与数据库的状态密切相关。为此在数据字典中存储了优化器需要的统计信息(database statistics), 主要包括如下几个方面:
- 基本表:该表的元组总数(
)、元组长度( )、占用的块数( )、占用的溢出块数( )等 - 基本表每个列:该列不同值的个数(
)、该列最大值、最小值,该列上是否已经建立了索引,如果有,又是哪一种索引等 - 索引:索引的层数(
)、不同索引值的个数、索引的选择基数 等
(2)代价估算示例
- 此部分了解即可,不做深入探究
A:全表扫描算法代价估算公式
B:索引扫描算法代价估算公式
C:嵌套循环算法代价估算公式
D:排序-合并连接算法的代价估算公式
分类:
数据库系统概论王珊第五版学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通