Oracle是世界領先的信息管理軟件開發商因其復雜的關系數據庫產品而聞名本文介紹Oracle優化器它是一個非常好用的工具Oracle在執行一個SQL之前首先要分析一下語句的執行計劃然後再按執行計劃去執行分析語句的執行計劃的工作是由優化器(Optimizer)來完成的
不同的情況一條SQL可能有多種執行計劃但在某一時點一定只有一種執行計劃是最優的花費時間是最少的相信你一定會用Pl/sql DeveloperToad等工具去看一個語句的執行計劃不過你可能對RuleChooseFirst rowsAll rows這幾項有疑問因為我當初也是這樣的那時我也疑惑為什麼選了以上的不同的項執行計劃就變了?
Oracle優化器的優化方式
Oracle優化器共有兩種的優化方式即基於規則的優化方式(RuleBased Optimization簡稱為RBO)和基於代價的優化方式(CostBased Optimization簡稱為CBO)
ARBO方式優化器在分析SQL語句時所遵循的是Oracle內部預定的一些規則比如我們常見的當一個where子句中的一列有索引時去走索引
BCBO方式依詞義可知它是看語句的代價(Cost)了這裡的代價主要指Cpu和內存優化器在判斷是否用這種方式時主要參照的是表及索引的統計信息統計信息給出表的大小 有少行每行的長度等信息這些統計信息起初在庫內是沒有的是你在做analyze後才出現的很多的時侯過期統計信息會令優化器做出一個錯誤的執行計劃因些我們應及時更新這些信息在Oracle及以後的版本Oracle列推薦用CBO的方式
我們要明了不一定走索引就是優的 比如一個表只有兩行數據一次IO就可以完成全表的檢索而此時走索引時則需要兩次IO這時對這個表做全表掃描(full table scan)是最好的
Oracle優化器的優化模式(Optermizer Mode)
優化模式包括RuleChooseFirst rowsAll rows這四種方式也就是我們以上所提及的如下我解釋一下
Rule:不用多說即走基於規則的方式
Choolse:這是我們應觀注的默認的情況下Oracle用的便是這種方式指的是當一個表或或索引有統計信息則走CBO的方式如果表或索引沒統計信息表又不是特別的小而且相應的列有索引時那麼就走索引走RBO的方式
First Rows:它與Choose方式是類似的所不同的是當一個表有統計信息時它將是以最快的方式返回查詢的最先的幾行從總體上減少了響應時間
All Rows:也就是我們所說的Cost的方式當一個表有統計信息時它將以最快的方式返回表的所有的行從總體上提高查詢的吞吐量沒有統計信息則走基於規則的方式
如何設定選用哪種優化模式
◆AInstance級別
我們可以通過在initora文件中設定OPTIMIZER_MODE=RULEOPTIMIZER_MODE=CHOOSEOPTIMIZER_MODE=FIRST_ROWSOPTIMIZER_MODE=ALL_ROWS去選用所提的四種方式如果你沒設定OPTIMIZER_MODE參數則默認用的是Choose這種方式
◆BSessions級別
通過SQL> ALTER SESSION SET OPTIMIZER_MODE=;來設定
◆C語句級別
這些需要用到Hint
From:http://tw.wingwit.com/Article/program/Oracle/201311/17645.html