Oracle CBO的使用与RBO的区别
一、Oracle CBO的使用
Oracle的基于成本的优化器(CBO)在Oracle 7中引入,但在Oracle 8i中才变得成熟。CBO会根据SQL语句的预计成本(这里的成本主要指CPU和内存的使用)来选择最优的执行计划。
统计信息:
CBO依赖于表和索引的统计信息来做出决策。这些统计信息提供了表的大小、行数、每行的长度等信息。
为了使用CBO,你需要确保统计信息是最新且准确的。可以使用ANALYZE命令或DBMS_STATS包来收集和维护这些统计信息。
优化器模式:
通过设置OPTIMIZER_MODE参数为ALL_ROWS、FIRST_ROWS等,可以控制优化器的偏好。
也可以在SQL语句中使用提示(Hint)来强制优化器使用CBO,例如/*+ ALL_ROWS */。
查询编写:
虽然CBO主要基于成本来选择执行计划,但SQL语句的编写方式仍然会影响性能。尽量编写高效且简洁的SQL语句。
二、CBO与RBO的区别
决策依据:
CBO:基于SQL语句的预计成本(CPU、内存等)来选择最优的执行计划。
RBO:基于Oracle内部预定的一些规则来选择执行计划,不考虑SQL语句的成本。
统计信息:
CBO:需要定期更新表和索引的统计信息。
RBO:不依赖于统计信息。
SQL语句的影响:
CBO:虽然SQL语句的编写方式会影响性能,但CBO主要基于成本来选择执行计划。
RBO:SQL语句的写法对执行计划有直接影响,需要开发人员非常了解RBO的各项细则。
适用性和淘汰:
CBO:从Oracle 8开始被广泛使用,并在Oracle 10g中完全取代了RBO。
RBO:在Oracle 10g及以后的版本中,RBO已经不再被支持。
优化目标:
CBO:主要目标是找到成本最低的执行计划,以实现最大的吞吐量或最快的初始响应时间。
RBO:更关注于遵循Oracle的预设规则来选择执行计划,而不考虑实际的性能成本。
总结:CBO是Oracle中更为先进和高效的查询优化策略,它基于统计信息和预计成本来选择最优的执行计划。而RBO则基于预设的规则来选择执行计划,不考虑实际的性能成本。从Oracle 10g开始,Oracle已经完全放弃了RBO,推荐使用CBO。