思维导图:
第9.4节:物理优化
-
物理优化的目的和重要性
- 物理优化旨在选择高效的操作算法或存取路径,以实现查询计划的优化。
- 与代数优化不同,物理优化专注于底层存取路径和执行算法的选择。
-
物理优化方法
- 基于规则的启发式优化:使用通常有效的启发式规则选择操作算法和存取路径。
- 基于代价估算的优化:利用优化器估算不同执行策略的代价,选择最小代价的执行计划。
- 两者结合的优化方法:结合启发式规则和代价估算,先缩小候选方案范围,然后在这些候选方案中选择最优的执行计划。
-
优化策略的选择
- 启发式规则虽普遍适用,但不总是最佳选择。
- 代价估算提供了一种更精确的方法来选择执行策略,但可能代价高昂。
- 结合两者可以平衡效率与精确性,通常是最实用的方法。
-
优化的实际应用
- 查询优化器通常会结合这两种技术来优化查询计划。
- 由于可能的执行策略众多,穷尽所有策略进行代价估算通常是不可行的。
- 先使用启发式规则选择若干较优的候选方案,再对这些方案进行代价估算,以快速确定最优方案。
第9.4.1节:基于启发式规则的存取路径选择优化
-
选择操作的启发式规则
- 小关系的处理:对小型关系使用全表顺序扫描,即使存在索引。
- 主码查询:对于“主码=值”的查询,使用主码索引,因为结果最多只有一个元组。
- 非主属性查询:对“非主属性=值”的查询,如果索引存在并且查询结果较小(<10%),使用索引扫描,否则使用全表扫描。
- 非等值或范围查询:对属性的非等值或范围查询,使用索引扫描如果选择率<10%,否则全表扫描。
- AND连接条件:对于AND连接的条件,如果有组合索引,则优先使用;没有则考虑一般索引扫描,否则全表扫描。
- OR连接条件:对于OR连接的条件,通常使用全表顺序扫描。
-
连接操作的启发式规则
- 排序-合并算法:如果两个表按连接属性排序,使用排序-合并算法。
- 索引连接算法:如果一个表在连接属性上有索引,选用索引连接算法。
- Hash Join算法:如果上述规则不适用且其中一个表较小,考虑使用hash join算法。
- 嵌套循环算法:最后可选用嵌套循环算法,选择块数较少的表作为外表。
-
选择最优算法的依据
- 根据表的大小、索引的存在与否以及查询条件的特点,选择最适合的存取路径和算法。
-
重点和难点
- 理解不同场景下哪种启发式规则最适用。
- 需要准确判断数据集的大小和索引的有效性来选择最优的存取路径。
-
易错点
- 错误地判断数据集大小,导致选择了不合适的存取路径或算法。
- 在存在有效索引的情况下仍然使用全表扫描,或者在索引不高效时过度依赖索引。
第9.4.2节:基于代价估算的优化
-
代价估算的概念和重要性
- 代价估算涉及计算不同操作算法的执行代价,以选择最有效的查询执行计划。
- 这种方法与启发式规则优化相比,更为精细和复杂,适用于编译执行的系统。
-
统计信息的角色
- 统计信息包括表的元组数、长度、块数等,对每列的不同值个数、最大最小值,以及索引信息。
- 这些信息用于估算谓词条件的选择率,从而计算查询代价。
-
代价估算的例子
- 全表扫描算法:估算整个表扫描的代价,依据表的大小。
- 索引扫描算法:考虑选择条件和索引类型,估算访问索引和相关数据块的代价。
- 嵌套循环连接算法:考虑两个表的大小,估算整个连接过程的代价。
- 排序-合并连接算法:如果表已排序,计算连接代价;如果未排序,还需加上排序代价。
-
复杂性和实用性
- 代价估算公式复杂,实际数据库系统中的公式更多且更为复杂。
- 代价估算方法在实际应用中需要考虑数据库的具体状态和查询的具体情况。
-
语义优化
- 利用数据库的语义约束来转换查询,提高执行效率,如通过检查数据范围约束来判断查询的可行性。
-
重点和难点
- 理解统计信息如何用于计算查询代价。
- 掌握不同类型查询操作的代价估算方法。
-
易错点
- 错误解读统计信息或估算方法,导致选择不恰当的查询执行计划。
- 在复杂查询情况下,未能准确估算查询代价,从而选择了效率较低的查询方案。
总结:
重点
- 代价估算的原理:理解代价估算是基于数据库的统计信息来预测不同查询执行计划的成本。
- 统计信息的应用:了解如何利用关于表的大小、索引、元组数量等统计信息来估算查询代价。
- 不同算法的代价估算:理解全表扫描、索引扫描、嵌套循环连接和排序-合并连接等算法的代价估算方法。
- 语义优化的概念:了解如何使用数据库的语义约束来优化查询。
难点
- 代价估算方法的复杂性:理解和应用各种代价估算公式的复杂性,特别是在不同类型的查询和数据库状态下。
- 统计信息的解读和应用:正确解读统计信息,并基于这些信息做出合理的代价估算。
易错点
- 误解统计信息:错误地解释或应用统计信息,导致代价估算不准确。
- 代价估算的误用:在某些情况下,可能过分依赖代价估算,忽视了查询的具体情况或数据库的实际状态。
- 忽视语义优化:在适用的情况下未能利用数据库的语义约束进行优化。