oracle的優化器有兩種優化方式,即基於規則的優化方式(rule-based optimization,簡稱為rbo)和基於代價的優化方式(cost-based optimization,簡稱為cbo),在oracle8及以後的版本,oracle強列推薦用cbo的方式
rbo方式:優化器在分析sql語句時,所遵循的是oracle內部預定的一些規則。比如我們常見的,當乙個where子句中的一列有索引時去走索引。
cbo方式:它是看語句的代價(cost),這裡的代價主要指cpu和記憶體。優化器在判斷是否用這種方 式時,主要參照的是表及索引的統計資訊。統計資訊給出表的大小、有少行、每行的長度等資訊。這些統計資訊起初在庫內是沒有的,是做analyze後才出現 的,很多的時侯過期統計資訊會令優化器做出乙個錯誤的執行計畫,因些應及時更新這些資訊。
注意:走索引不一定就是優的,比如乙個表只有兩行資料,一次io就可以完成全表的檢索,而此時走索引時則需要兩次io,這時全表掃瞄(full table scan)是最好
優化模式包括rule、choose、first rows、all rows四種方式:
rule:基於規則的方式。
choolse:預設的情況下oracle用的便是這種方式。指的是當乙個表或或索引有統計資訊,則走cbo的方式,如果表或索引沒統計資訊,表又不是特別的小,而且相應的列有索引時,那麼就走索引,走rbo的方式。
first rows:它與choose方式是類似的,所不同的是當乙個表有統計資訊時,它將是以最快的方式返回查詢的最先的幾行,從總體上減少了響應時間。
all rows:也就是我們所說的cost的方式,當乙個表有統計資訊時,它將以最快的方式返回表的所有的行,從總體上提高查詢的吞吐量。沒有統計資訊則走rbo的方式。
設定選用哪種優化模式:
a、instance級別我們可以通過在initsid.ora檔案中設定optimizer_mode=rule/choose/first_rows/all_rows如果沒設定optimizer_mode引數則預設用的是choose方式。
b、sessions級別通過alter session set optimizer_mode=rule/choose/first_rows/all_rows來設定。
c、語句級別用hint(/*+ ... */)來設定
為什麼表的某個字段明明有索引,但執行計畫卻不走索引?
1、優化模式是all_rows的方式
2、表作過analyze,有統計資訊
3、表很小,上文提到過的,oracle的優化器認為不值得走索引。
詳介oracle的RBO CBO優化器
oracle的優化器有兩種優化方式,即基於規則的優化方式 rule based optimization,簡稱為rbo 和基於代價的優化方式 cost based optimization,簡稱為cbo 在oracle8及以後的版本,oracle強列推薦用cbo的方式 rbo方式 優化器在分析sql...
詳介oracle的RBO CBO優化器
oracle的優化器有兩種優化方式,即基於規則的優化方式 rule based optimization,簡稱為rbo 和基於代價的優化方式 cost based optimization,簡稱為cbo 在oracle8及以後的版本,oracle強列推薦用cbo的方式 rbo方式 優化器在分析sql...
詳介oracle的RBO CBO優化器
oracle的優化器有兩種優化方式,即基於規則的優化方式 rule based optimization,簡稱為rbo 和基於代價的優化方式 cost based optimization,簡稱為cbo 在oracle8及以後的版本,oracle強列推薦用cbo的方式 rbo方式 優化器在分析sql...