目前是一名刚刚入行的小白,由于之前转正时被问到执行计划,接触到RBO与CBO,遂有深入学习数据库优化的想法。先从 Postgre 开始。学习一下数据库优化相关知识。
为什么需要数据库优化器?
数据库优化器对编写sql的我们处于透明状态。数据库优化器接受数据库语法分析模块传递的查询数,输出执行计划(优化后的执行路径),以此提高sql执行效率。 而其存在的必要性为以下几点
- 我们(下指数据库操作者)与优化器存在信息差(数据库统计信息)
- 我们与优化器之间存在时间差(时效性问题)
- 我们与优化器之间存在计算能力差(列举选择路径)
而一般优化点在于逻辑上的等价变换、物理路径筛选
进而引出数据库优化的两种类型:
- 基于规则的查询优化(逻辑优化,Rule Based Optimization,简称RBO)。
- 基于代价的查询优化(物理优化,Cost Based Optimization,简称CBO)。
RBO一般对关系代数进行等价变化,CBO则是通过计算执行器在执行路径链接时的代价来选择路径。
疑问点:之前总是认为两种不是合作的关系,因为数据库可以选择4种模式:rule,defaut,first row,ALL rows。所以,是否只有CBO依赖统计信息,而rule不需要统计学习,defaut,first row,ALL rows,是根据返回结果形式的不同,选择了不同的路径,只与CBO相关?数据库统计信息什么时候更新才能更好的避免因统计信息未更新导致的优化效果差?