﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-fjpan2002-文章分类-Oracle</title><link>http://www.blogjava.net/fjpan2002/category/17181.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 03 Mar 2007 04:32:04 GMT</lastBuildDate><pubDate>Sat, 03 Mar 2007 04:32:04 GMT</pubDate><ttl>60</ttl><item><title>Oracle的优化器</title><link>http://www.blogjava.net/fjpan2002/articles/80915.html</link><dc:creator>勇敢的心</dc:creator><author>勇敢的心</author><pubDate>Mon, 13 Nov 2006 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/fjpan2002/articles/80915.html</guid><wfw:comment>http://www.blogjava.net/fjpan2002/comments/80915.html</wfw:comment><comments>http://www.blogjava.net/fjpan2002/articles/80915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fjpan2002/comments/commentRss/80915.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fjpan2002/services/trackbacks/80915.html</trackback:ping><description><![CDATA[Oracle的优化器有两种优化方式,即基于规则的优化方式(Rule-Based Optimization，简称为RBO)和基于代价的优化方式(Cost-Based Optimization，简称为CBO)，在Oracle8及以后的版本,Oracle强列推荐用CBO的方式 
<p>    <strong>RBO方式：</strong>优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。比如我们常见的，当一个where子句中的一列有索引时去走索引。</p><p>    <strong>CBO方式：</strong>它是看语句的代价(Cost),这里的代价主要指Cpu和内存。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有少行、每行的长度等信息。这些统计信息起初在库内是没有的，是做analyze后才出现的，很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些应及时更新这些信息。</p><p>    优化模式包括Rule、Choose、First rows、All rows四种方式：</p><p>    <strong>Rule：基于规则的方式。</strong></p><p>    <strong>Choolse：</strong>默认的情况下Oracle用的便是这种方式。指的是当一个表或或索引有统计信息，则走CBO的方式，如果表或索引没统计信息，表又不是特别的小，而且相应的列有索引时，那么就走索引，走RBO的方式。</p><p>    <strong>First Rows：</strong>它与Choose方式是类似的，所不同的是当一个表有统计信息时，它将是以最快的方式返回查询的最先的几行，从总体上减少了响应时间。</p><p>    <strong>All Rows:</strong>也就是我们所说的Cost的方式，当一个表有统计信息时，它将以最快的方式返回表的所有的行，从总体上提高查询的吞吐量。没有统计信息则走RBO的方式。</p><p>    <strong>设定选用哪种优化模式：</strong></p><p>    A、Instance级别我们可以通过在initSID.ora文件中设定OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS如果没设定OPTIMIZER_MODE参数则默认用的是Choose方式。<br />    B、Sessions级别通过ALTER SESSION SET OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS来设定。<br />    C、语句级别用Hint（/*+ ... */）来设定</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img id="Codehighlighter1_7_21_Open_Image" onclick="this.style.display='none'; Codehighlighter1_7_21_Open_Text.style.display='none'; Codehighlighter1_7_21_Closed_Image.style.display='inline'; Codehighlighter1_7_21_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_7_21_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_7_21_Closed_Text.style.display='none'; Codehighlighter1_7_21_Open_Image.style.display='inline'; Codehighlighter1_7_21_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_7_21_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_7_21_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080">+ ALL_ROWS </span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"> employee_id, last_name, salary, job_id </span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000"> employees </span><span style="COLOR: #0000ff">WHERE</span><span style="COLOR: #000000"> employee_id </span><span style="COLOR: #808080">=</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #800000">183</span><span style="COLOR: #000000">;</span></div><img src ="http://www.blogjava.net/fjpan2002/aggbug/80915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fjpan2002/" target="_blank">勇敢的心</a> 2006-11-13 16:08 <a href="http://www.blogjava.net/fjpan2002/articles/80915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>