网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  讲解oracle优化器的优化方式和优化模式 (1)     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:128次  录入:管理员--2008-03-27  
 

【赛迪网-it技术报道】oracle在执行一个sql之前,首先要分析一下语句的执行计划,然后再按执行计划去执行。分析语句的执行计划的工作是由优化器(optimizer)来完成的。不同的情况,一条sql可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的,花费时间是最少的。相信你一定会用pl/sql developer、toad等工具去看一个语句的执行计划,不过你可能对rule、choose、first rows、all rows这几项有疑问,因为我当初也是这样的,那时我也疑惑为什么选了以上的不同的项,执行计划就变了?

1、优化器的优化方式

oracle的优化器共有两种的优化方式,即基于规则的优化方式(rule-based optimization,简称为rbo)和基于代价的优化方式(cost-based optimization,简称为cbo)。

a、rbo方式:优化器在分析sql语句时,所遵循的是oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。

b、cbo方式:依词义可知,它是看语句的代价(cost)了,这里的代价主要指cpu和内存。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小 、有少行、每行的长度等信息。这些统计信息起初在库内是没有的,是你在做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些我们应及时更新这些信息。在oracle8及以后的版本,oracle列推荐用cbo的方式。

我们要明了,不一定走索引就是优的 ,比如一个表只有两行数据,一次io就可以完成全表的检索,而此时走索引时则需要两次io,这时对这个表做全表扫描(full table scan)是最好的。

2、优化器的优化模式(optermizer mode)

优化模式包括rule,choose,first rows,all rows这四种方式,也就是我们以上所提及的。如下我解释一下:

rule:不用多说,即走基于规则的方式。

choolse:这是我们应观注的,默认的情况下oracle用的便是这种方式。指的是当一个表或或索引有统计信息,则走cbo的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走rbo的方式。

first rows:它与choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。

all rows:也就是我们所说的cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐量。没有统计信息则走基于规则的方式。

3、如何设定选用哪种优化模式

◆a、instance级别

我们可以通过在init.ora文件中设定optimizer_mode=rule、optimizer_mode=choose、optimizer_mode=first_rows、optimizer_mode=all_rows去选用3所提的四种方式,如果你没设定optimizer_mode参数则默认用的是choose这种方式。

◆b、sessions级别

通过sql> alter session set optimizer_mode=;来设定。

◆c、语句级别

这些需要用到hint,比如:

sql> select /*+ rule */ a.userid, 

2 b.name, 

3 b.depart_name 

4 from tf_f_yhda a, 

5 tf_f_depart b 

6 where a.userid=b.userid;

4、为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢?

◆a、不走索引大体有以下几个原因

你在instance级别所用的是all_rows的方式

你的表的统计信息(最可能的原因)

你的表很小,上文提到过的,oracle的优化器认为不值得走索引。

◆b、解决方法

可以修改init.ora中的optimizer_mode这个参数,把它改为rule或choose,重起数据库。也可以使用4中所提的hint.

删除统计信息

sql>analyze table table_name delete statistics;

表小不走索引是对的,不用调的。

5、其它相关

◆a、如何看一个表或索引是否是统计信息

sql>select * from user_tables 

2 where table_name=<table_name> 

3 and num_rows is not null; 

sql>select * from user_indexes 

2 where table_name=<table_name> 

3 and num_rows is not null;

◆b、假如我们先用cbo的方式,就应当及时去更新表和索引的统计信息,以免生形不切合实的执行计划。

sql> analyze table table_name compute statistics; 

sql> analyze index index_name estimate statistics;

 
 
上一篇: oracle回滚表空间数据文件误删除处理    下一篇: 讲解oracle数据库的全文索引设置步骤 (1)
  相关文档
三步教会你掌握oracle外表(external table) 08-18
Oracle 数据库集中复制方法逐步精细 05-27
Oracle智能代理与OMS的问题解答 05-27
实例讲解如何更改字段至兼容的不同类型 (1) 04-03
使用Oracle Text构建全文搜索应用程序 05-13
用pipelined table实现split函数的示例 06-23
细化解析:oracle 10g的统计信息工具awr 11-15
细化解析:Oracle 10g ASM 的一点经验 09-01
Oracle数据库密码文件的使用和维护 01-15
由浅入深讲解oracle数据库的备份与恢复 05-14
快速掌握ora-00600 4194错误的解决方法 11-15
如何使用oracle提供的字符扫描工具csscan 03-06
探讨基于不绑定变量与绑定变量的柱状图作用 (1) 03-10
详细讲解oracle物理结构故障的处理方法 (1) 05-15
数据字典管理的表空间存在着效率问题 09-01
实例讲解如何重复利用这个外部表的表结构 05-07
在Oracle 9i中Form Builder使用树心得 07-07
Oracle-Decode()函数和CASE语句的比较 06-03
oracle数据库共享连接和专用连接方式比较 (1) 04-28
详细讲解获得当前"scn"的几种有效方式 03-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息