Oracle优化器 Cardinality基数与Selectivity选择性
优化器(optimizer)是oracle数据库内置的一个核心子系统。优化器的目的是按照一定的判断原则来得到它认为的目标SQL在当前的情形下的最高效的执行路径,也就是为了得到目标SQL的最佳执行计划。依据所选择执行计划时所用的判断原则,oracle数据库里的优化器又分为RBO和CBO两种。 一、基于规则的优化器。《RBO: Rule-Based Optimization》 Oracle会在代码里事先为各种类型的执行路径定一个等级,一共15个等级,从等级1到等级15,oracle认为等级1的执行路径是效率最高的,等级15是执行效率最差的。对于等级相同的执行计划,oracle根据目标对象 Oracle优化器是数据库的核心组成部分,负责为SQL查询生成最佳执行计划。优化器有两种主要类型:基于规则的优化器(RBO)和基于成本的优化器(CBO)。这两种优化器在选择执行路径时遵循不同的策略。 RBO,即Rule-Based Optimization,会预先设定不同执行路径的优先级,从1到15,1表示最优,15表示最差。在相同优先级的执行计划之间,Oracle会根据数据字典中的顺序进行选择。然而,RBO对于OLTP系统可能是合适的,但它存在一个问题:一旦SQL执行计划出现问题,调整起来非常困难。从ORACLE 10g开始,RBO已经被CBO完全取代。 CBO,Cost-Based Optimization,自ORACLE 8引入,至ORACLE 9i逐渐成熟,并在ORACLE 10g成为主要优化器。CBO评估每个执行路径的成本,选择成本最低的计划。这个成本是基于涉及的表、索引和列的统计信息计算出来的,包括IO、CPU和网络资源的消耗。在没有系统统计信息时,CBO的成本计算主要基于IO。 在CBO中,有两个关键概念:Cardinality和Selectivity。 Cardinality是Oracle预估的返回行数,即对SQL查询特定步骤预期结果的记录数估计。如果针对整个SQL,Cardinality表示最终结果集的估计大小。例如,如果一个有1000行数据的表T,其COL1列有500个不重复值,而没有直方图和空值,那么在WHERE COL1='条件'的查询中,优化器会假设数据均匀分布,估计有2行会被选中(1000/500)。准确的Cardinality值有助于生成更有效的执行计划。 Selectivity是应用特定谓词后返回结果集记录数与原始无谓词结果集记录数的比例。它的值在0到1之间,表示选择性的好坏。Selectivity越低,表示过滤条件更有效,因为返回的数据更少。当Selectivity为1时,表示没有任何过滤效果,选择性最差。 优化器正确估计Cardinality和Selectivity至关重要,因为它们直接影响到执行计划的选择。错误的估计可能导致全表扫描或不必要的索引扫描,从而影响性能。因此,定期更新表和索引的统计信息是保持优化器准确性的关键步骤。 Oracle的优化器通过Cardinality和Selectivity来决定SQL查询的最佳执行路径,CBO以其成本计算能力优于RBO,更适应现代复杂数据库环境的需求。理解并优化这两个概念,对于提升数据库性能具有重要意义。
- 粉丝: 5
- 资源: 962
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助