CBO通过执行几个复杂的步骤得出用户査询的最佳执行计划.原始的SQL语句多数都可能被转换,CBO对可选的访问路径(例如,全表扫描或基于索引的扫描)进行评估。如果需要进行表联结,优化程序会评估所有可能的联结方法和联结次序。优化程序对所有的可能性进行评估,然后选择总成本--包括所使用的I/O和CPU资源--为最小的执行计划。
1.SQL转换
Oracle几乎不会以原始形式来执行査询。如果CBO确定另一个SQL表达形式可以更有效地得到同样的结果,那么在执行该査询之前就会转换该语句。这方面的一个典型例子是,在提交一个具有OR条件的査询时,CBO会将该查询转换为一个使用UNION或UNION ALL的语句;
或者表达式中可能包含一个索引提示,但CBO可能会对这个语句进行转换,使得它能进行全表扫描,这在某些情况下很有效。在任何情况下都应记住,用户所希望的査询执行方式并不一定是Oracle执行该査询的方式,但査询的结果仍然是相同的。下面是Oracle CBO执行的一些常见的转换:
将IN转换为OR语句:
将OR转换为UNION或UNION ALL语句;
将非直接相关的嵌套的选择语句转换为更有效的联结(join);
将外联结转换为更有效的内联结(inner join);
将复杂的子查询转换为联结、半联结和反联结(anti join);
对基于星型模式(star schema)的数据仓库表进行星型转换;
将BETWEEN转换为大于等于或小于等于语句。
2.选择访问路径
Oracle常常通过不同的路径访问相同的数据。对于每一个查询,优化程序评估所有的可用路径,并根据资源使用的情况选取花费最少的一个。下面的章节对优化程序可以使用的常用访问方法进行了概要介绍。如果涉及联结操作,那么还需要对联结次序和联结方法进行评估,最终得到最好的执行计划。下面简要了解一下优化程序在确定执行路径前要经过的步骤。
•全表扫描
Oracle在全表扫描期间对整个表进行扫描。Oracle顺序地读取表中的每个块,因此,DB_FILE_MULTIBLOCK_READ_COUNT初始化参数的值设置得足够高,全表扫描才能有效。这个参数用于确定数据库在顺序扫描过程中读取块数目的最大值。但是,对于大表,全表扫描通常效率不高。
•通过ROWID对表进行访问
通过ROWID对表进行访问是使用唯一的ROWID来检索行。在Oracle中,ROWID指定了行所驻留在数据文件和数据块中的具体位置,因此ROWID访问是Oracle中检索行最快的方式。通常,Oracle通过对表索引的索引扫描获得ROWID。使用ROWID,Oracle可以很快获取需要的行。
•索引扫描
索引存储两种东西:索引列的列值和表中包含该列值的行的ROWID.索引扫描从索引中检索数据,该索引使用了索引列的值。如果查询只想获得被索引的列值,Oracle将返回这些值。如果査询还需要被索引列之外的其他列,Oracle将使用ROWID来获取表的行。
3.选择联结方法
当需要访问两个或多个表中的数据时,Oracle根据共同的列来联结这些表。但是,有儿种方式可以对从执行计划步骤中返回的行集进行联结。对于每一条语句,Oracle根据统计数据和表的唯一键或主键的类型来评价联结方法的优劣。在Oracle评估完这些联结方法之后,CBO选取成本最低的联结方法。
下面是CBO使用的一些常见的联结方法。
嵌套循环联结(nested-loop join):嵌套循环联结包括指定一个表作为联结循环中的驱动表(driving table) 也称为外部表(outer table)。联结中的另一个表被称为内部表(inner table)。Oracle对驱动表中的每行数据都要读取内部表的所有行。
散列联结(hash join):在联结两个表时,Oracle用其中较小的表在联结键上构建一个散列表。然后,Oracle对较大的表进行搜索,并从散列表中返回被联结的行。
分类合并联结(sort-merge join):分类联结操作将联结键上的输入值进行分类,合并联结操作将己分类的列表进行合并。如果输入值已按照联结列进行了分类,那么,没必要为每个行源执行分类联结操作。
4.选择联结次序
优化程序选择了联结方法后,它就要确定表的联结次序。优化程序的目的总是以某种方式对表进行联结,这种联结方式使得驱动表能够消除最大数目的行数据。一个带有4个表的查询最多可以有4的阶乘,即24种可能的表联结方式。
基于可用的索引和访问方法,每一个这样的联结次序都会导致许多不同的执行计划。对于一个最佳联结策略的搜索可能要花很长时间对大量的表进行査询,因此,Oracle依靠一个适配搜索策略(adaptive search strategy)来限制寻找最佳执行计划所要花费的时间。一个适配搜索策略意味着用于优化的时间只占执行査询自身所花费总时间的一个小的百分比。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




