知识卡片
基于规则与基于代价优化的选择率决策逻辑
内容
物理优化要为代数优化产出的每个逻辑运算挑选具体的执行算法,有两条 路径。基于规则的优化(RBO)靠一套预先定好的启发式规则直接选算法, 不需要临时计算代价:条件是”主码=值”这类等值查询直接走主码索引, 结果最多一条记录;条件是”非主属性=值”且该属性有索引时,先估算 选择率(满足条件的记录占比),选择率低于10%就用索引扫描,否则 索引扫描反而不划算,改用全表扫描(因为索引扫描每条命中记录都要 多付出一次跳转开销,命中记录太多时这些额外开销累加起来会超过省下 的全表遍历成本);用OR连接的析取条件因为难以用单一索引覆盖所有 分支,通常直接全表扫描。基于代价的优化(CBO)更进一步:不满足于 “规则大致合理”,而是用数据字典里维护的统计信息(每张表的记录数、 每个字段的不同值个数和取值分布、每个索引的高度和叶子节点数等) 和代价模型,对每种可能的执行方案分别算出精确的代价估计,选代价 最低的方案——这也解释了为什么10%这个选择率阈值不是绝对的,而是 一个经验起点,真正精确的判断要靠实际统计信息算出来。因为统计信息 的维护本身有开销,数据库系统通常在系统负载较低时才更新统计信息, 这意味着CBO依赖的统计数据并不总是最新、最精确的,是这套方法固有 的一个局限。
参考来源
- 位置:《数据库原理(微课版)》第10章《查询处理与优化》10.4.1-10.4.2节
"基于规则的启发式优化算法""基于代价估算的优化"(源文件:
_epub-src/index_split_006.html与index_split_007.html)
- 结论依据:原文明确"对选择条件是'非主属性=值'的查询,并且选择列上
有索引,则要估算查询结果的元组数目,选择率<10%时,可以使用索引
扫描算法,否则使用全表扫描""基于代价的优化……利用统计信息和代价
模型计算各种可能的查询执行计划的代价,从中选用代价最低的执行方案
……为了节省开销,数据库系统往往在系统负载不重的时候进行统计,
因此统计信息并不十分精确",因此可以推出RBO与CBO的决策逻辑及CBO
的固有局限。
- 原始内容:对选择条件是"非主属性=值"的查询,并且选择列上有索引,
则要估算查询结果的元组数目,选择率<10%时,可以使用索引扫描算法,
否则使用全表扫描……数据库系统往往在系统负载不重的时候进行统计,
因此统计信息并不十分精确。