什么是CBO?
CBO(Cost-Based Optimization)基于开销的优化。能够在众多执行计划中依据开销选出最高效的执行计划,从而提高数据库的性能。
既然是基于事务执行开销的选优,那开销是怎样计算的呢?
事务开销的计算
对于每个事务的执行计划,CBO会基于统计信息计算出一个预期的成本值。这个成本通常以CPU、I/O操作、内存消耗等形式量化。
例如一条SQL查询(SELECT)语句的执行过程,如下所示:
成本估算涉及到一系列复杂的计算过程,比如:
- 计算全表扫描或索引扫描的成本,考虑磁盘I/O和CPU处理;
- 估算连接操作的成本,考虑联接类型(Nested Loops, Hash Join, Sort Merge Join)和参与联接的记录数量;
- 预测排序操作的成本,考虑内存可用性和临时区的使用;
- 考虑到其他资源消耗,如缓冲区缓存命中率、网络传输等。
统计信息度包含哪些?
CBO适用于大多数需要高效查询性能的场景。特别是对于复杂的SQL语句,CBO可以更好地评估和比较各种查询路径的成本,从而选择出最优的执行计划。由于CBO依赖于统计信息来做出决策,因此在数据分布发生变化或者新数据加载之后,更新统计信息是保持CBO优化效果的关键。
- CBO依赖于数据库对象(如表、索引)上的统计信息来估算数据量、数据分布以及索引的选择性。这些统计信息通常由
ANALYZE
命令或自动收集任务维护。 - 统计信息包括但不限于表的总行数、唯一值数量、直方图、索引密度等,这些都是用来精确预测查询成本的关键。
开启CBO有缺点吗?
-
依赖统计信息的准确性
若统计信息过期或采样不充分,CBO 可能生成次优计划。例如,当某表数据分布不均但统计信息未更新时,可能导致错误选择全表扫描而非索引扫描。 -
计算成本较高
CBO 需要计算多种执行计划的成本,可能增加优化阶段的耗时。尤其在复杂查询中,搜索空间过大会影响优化速度。 -
维护统计信息的开销
定期收集统计信息(如 ANALYZE 命令)可能占用系统资源,对高频更新的表可能产生性能影响。
总结:
CBO 在多数场景下能提升查询效率,但对统计信息管理和计算资源有较高要求。实际应用中需结合业务特点,权衡优化器选择。