Oracle Optimizer:迁移到使用基于成本的优化器-----系列1.1

发表于:2007-07-02来源:作者:点击数: 标签:
Oracle Optimizer:迁移到使用基于成本的优化器-----系列1.1 如果在Oracle以前的版本(7.0或更早)中 开发 应用程序, 数据库 会采用基于规则的优化器(译者注:以下称RBO),本篇将帮助你理解Oracle优化器并迁移到基于成本优化器(译者注:以下称CBO)的几种

Oracle Optimizer:迁移到使用基于成本的优化器-----系列1.1

      

如果在Oracle以前的版本(7.0或更早)中开发应用程序,数据库会采用基于规则的优化器(译者注:以下称RBO),本篇将帮助你理解Oracle优化器并迁移到基于成本优化器(译者注:以下称CBO)的几种高效方法.下面是五大部分的第一部分

 

第一部分

1.         什么是优化器?

2.         为什么要优化?

3.         可用的优化器.

4.         为什么要移除RBO?

5.         为什么要迁移到CBO?

 

第二部分

1.         影响CBO的初始化参数.

2.         影响CBO的Oracle内部参数.

 

第三部分

1.         升级至CBO的设置变化.

2.         生成统计资料

3.         DML监视

 

第四部分

1.         提示.

2.         存储概要

3.         SYS模式的统计资料

 

第五部分

1.         新的权限

2.         怎样在CBO中分析执行计划

3.         Oracle Application 11i的CBO详细信息

4.         结论

 

1.         什么是优化器?

在Oracle中,执行一个查询可能有不只一种方法,拥有最佳等级的执行计划,或者说是最快速度最少成本返回输出并达到最佳资源利用的执行计划.优化器生成执行计划。优化器是运行在数据库中致力以得到基于不同条件下执行路径列表的引擎并且选择运行查询的最高效执行计划。一旦执行计划生成,它将执行输出。在Oracle中优化器与DML语句有关.

 

2.         为什么要优化?

你知道!优化一个针对执行时以最少时间和最佳的资源利用的查询,意味着快速和高效。对于资源,意味着CPU利用情况,磁盘输入输出,内存消耗和其它范围的网络操作。不考虑你的服务器在这些资源上是多么充足,不适当或较不理想的的查询总是付出昂贵的代价并拖慢你的任务,或者对服务器上的其它处理产生影响.依赖于各种因素的查询范围是昂贵的,包括抽取的结果集大小,扫描检索结果集的数据的大小和系统的即时负荷。适当的语法优化将节省用户运行时间的消耗和不必要的资源利用。

 

3.         可用的优化器

Oracle有两种模式的优化器,基于规则和基于成本,它决定了最佳的执行计划。

本篇重点介绍CBO,简要概述RBO.

 

3.1          基于规则的优化(RBO)

RBO遵循简单的分级方法学。RBO使用15种级别要点,当接收到查询,优化器将评估使用到的要点数目,然后选择最佳级别(最少的数量)的执行路径来运行查询,15个要点级别如下:

                                       

                  .使用ROWID的单独记录

                  .使用簇连接的单独记录.

                  .使用散列簇主键的单独记录.

                  .使用主键的单独记录.

                  .簇连接.

                  .散列簇连接

                  .索引簇主键.

                  .复合主键.

                  .单列主键.

                  .索引列的结合范围查找.

                  .索引列的非结合范围查找.

                  .排序合并连接.

                  .索引列的最大max或min

                  .索引列的order by.

                                 .全表扫描.

        举例来说,如果生成一个在where子句条件中精确匹配两列的表的查询,一列拥有主键(对应于使用主键的单独记录.)而别一列拥有非主键(对应于单列主键),则RBO更喜欢主键(对应于使用主键的单独记录.),而不是非主键(对应于单列主键).

当在一个查询中涉及到要访问多个表,优化器需要确定那个表是驱动表.RBO生成一组连接顺序,每一个表做为第一个表,然后优化器从执行计划的结果集中选择最理想的计划.优化器评估不同条件诸如(最少的嵌套循环,最少的排序合并连接,最佳级别的表访问路径,等等),如果仍然不能比较出结果,则优化器会选择查询的FROM子句第一个表作为驱动表.因此,常规条件下的编码实践将把驱动表放在最右边.其它的表按访问顺序跟随在FROM子句中. 也就是说,表的顺序是从右到左的访问顺序。

请注意,用以搜索列的操作符也扮演着决定级别的角色,有时甚至考虑索引的时间作为级别

例如下面的表证明了在列1和列2上的索引使用情况,如果它们两个在where子句上用”=”连接

例:

select * from am79 where col1 = 1 and col2 = @#amar@#;

      -- here both col1 and col2 are indexed.

 

-------------------------------------------------------------------------------------

              Normal index types                   |     Index used in RBO

column1(a)     column2(b)    column1+column2(c)   |    

  -------------------------------------------------------------------------------------

non-unique        non-unique             c

non-unique       non-unique                             a + b

non-unique       non-unique      non-unique             c

unique           non-unique                             a

unique                           non-unique             a

unique           unique                                 b (the most recent index created)

unique           unique          unique                 c

-------------------------------------------------------------------------------------

-The above is tested on Oracle 8.1.7.1.

-In case of non-unique single column indexes, both indexes are used.

-In case of unique indexes, they are not combined for execution plan, any one is taken.

-Preference is given to the index available with the "=" operator column, than with

others operators.

-Don@#t create bitmap & function-based indexes, these will not work in RBO.

-------------------------------------------------------------------------------------

 

RBO偏好Oracle早期版本的大多数设置作为执行计划路径,这种选择是统一的。查询总会产生同样的方法对于运行在不同数据库上相同的应用程序(待续).

 

原文转自:http://www.ltesting.net