学院首页 软件应用 编程开发 创意设计 认证培训 软件论坛
ASP ASP.NET PHP JSP SQL MYSQL Java VB

您的位置:学院 >> 编程开发 >> Oracle >> 针对Oracle数据库的优化器详细介绍


针对Oracle数据库的优化器详细介绍


本文的目的:

1、说一说Oracle的Optimizer及其相关的一些知识。

2、回答一下为什么有时一个表的某个字段明明有索引,当观察一些SQL的执行计划时,发现确不走索引的问题。

3、如果你对 FIRST_ROWS、 ALL_ROWS这两种模式有疑惑时也可以看一下这篇文章。

开始吧:

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=
  3 AND num_rows is not null;
  
  SQL>SELECT * FROM user_indexes
  2  WHERE 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;
  

具体的ANALYZE语句请参照Oracle8i/9i 的refrence文档。

技术文章快速查找

栏目导航
软件应用
·操作系统 ·杀毒防黑 ·应用软件
·聊天软件 ·网络软件  
Web开发
·ASP ·JavaScript ·CGI
·JSP ·VbScript ·Web服务器
·PHP ·XML  
开发语言
·VB ·VC ·ASP.NET
·Java ·C/C++ ·Delphi
数据库开发
·MySQL ·SQL/Access ·PowerBuilder
·Oracle ·DB2  
网站设计
·Flash ·Dreamweaver ·HTML/CSS
·Fireworks ·FrontPage  
平面设计
·Photoshop ·CorelDraw ·AutoCAD
·FreeHand ·Illustrator ·3DsMAX
媒体动画
·Director ·Authorware ·Maya
·视频处理    


相关软件 产品库推荐
·笔记本 ·台式机 ·服务器
·数码相机 ·手机 ·GPS
·DV摄像机 ·MP3 ·MP4
·CPU ·硬盘 ·内存
·主板 ·显卡 ·显示器
·打印机 ·投影机 ·路由器

还没人留言,抢个先,哈哈!
对"针对Oracle数据库的优化器详细介绍"的评论 - 快速回贴
内容:
  [完成后可按Ctrl+Enter发布]

百度中 针对Oracle数据库的优化器详细介绍 相关内容
Google搜索中 针对Oracle数据库的优化器详细介绍 相关内容
雅虎中 针对Oracle数据库的优化器详细介绍 相关内容
Sogou搜索中 针对Oracle数据库的优化器详细介绍 相关内容

相关软件 最新回复帖子:

·Windows Vista 中卸载软件的不同方式
·没有mysql支持时的替代方案
·一个可以发送附件及HTML格式邮件的PHP类
·AutoCAD打造精致三维鸟笼实例详解
·Photoshop自定义水晶字特效样式
·AutoCAD三维基础实例教程
·PS为黑背景长发美女照片抠图换背
·用Photoshop自制个性摩托车贴花小经验
·轻松几步将美女照片处理为手工素描
·巧用Photoshop画笔轻松绘制创意特效


  相关软件 针对Oracle数据库的优化器详细介绍相关文章
关于Oracle数据库的性能优化心得 Oracle Spatial时态空间数据库设计
使用Oracle9i全索引扫描快速访问数据 Oracle存储过程中去掉重复字符串函数
Oracle与SQL Server之间的数据迁移 提高Oracle数据库系统Import的性能
Delphi中BDE直连方式访问Oracle的问题 Oracle互联网文件系统达到信息共享
Oracle数据库磁盘输入输出性能和优化 用Oracle数据库的WEB服务制作网页
Java开发使用Oracle数据库的注意事项 Oracle 9i在AIX上的性能调整--内存篇
Oracle许可执行安全模式更好实现控制 Oracle Spatial临时表具体设计及功能
可预见的Oracle应用程序的性能调优 Oracle数据库设计开发阶段性能优化
浅谈Oracle数据库的建模与具体设计 Oracle大文本在ASP中存取问题的解决
用.NET调用oracle存储过程返回记录集 连接Oracle数据库及故障解决办法介绍