前面講了ORACLE性能調優原則,但是可能有許多朋友不知道ORACLE優化機理到底是什麼?下面作一簡單說明。
解釋
先說明一下,ORACLE有一個優化器(Optimizer),ORACLE的優化機理就是從Optimizer開始的。
明確兩個概念:Optimizer 對ORACLE的優化方式有兩種,一種是基於規則的,我們稱為RBO(Rule-Based Optimization),一種是基於代價的CBO(Cost-Based Optimization),我們從字面就可基本理解這兩個優化方式的含義,不錯,RBO是根據ORACLE的內定規則實現的,比如我在“ORACLE性能調優原則”中講到的:索引,索引就是ORACLE的內定規則;而對於CBO,由於是基於代價的,也就是ORACLE機器的資源了,比如CPU和內存等,這個時候有朋友就問了,既然有這兩個方式,那ORACLE到底如何選擇呢,其實,這個問題有一半需要我們自己回答,有一半由ORACLE回答。因為我們在安裝ORACLE時就已決定了ORACLE到底調用什麼方式,這個就是init.ora中設定的OPTIMIZER_MODE參數,如果我們設為OPTIMIZER_MODE=RULE,它就會按RBO方式進行,反之按CBO了。當然,我們在開發程序時也可認為的改變規則,如SQL:
SELECT /*RULE*/ * FROM TABLE_NAME ,這個就使ORACLE強制使用RBO規則了,當然,ORACLE也比較“聰明”,它會根據用戶檢索表和該表的索引的統計信息來選擇優化方式了,這裡就出現了一個問題了,如果統計信息是陳舊的或者說是錯誤的,我們就必須用analyze人為的對表和索引進行重新統計了。
ORACLE的優化模式有如下幾種:RULE,CHOOSE,FIRSTROWS,ALLROWS四種,這四種模式必須和前面講的優化方式放在一起解釋,CHOOSE就是選擇的意思,如果有表和索引有統計信息,ORACLE就會CHOOSE CBO的優化方式了。對於FIRSTROWS,我給的解釋是它和CHOOSE差不多,只是以最快的方式返回前面的記錄行了;當然了ALLROWS就是以最快的方式返回所有行。
以上講了ORACLE的優化方式和優化模式,以及ORACLE如何選擇,下面我再講講我們認為的改變ORACLE的優化了:
1、修改ORACLE的init.ora的OPTIMIZER_MODE參數;
2、在寫SQL時人為指定優化方式,如:SELECT /*RULE*/ * FROM TABLE_NAME
3、為不讓ORACLE犯錯誤,我們有必要在日常維護中使用如下語句來優化表和索引:
spool d: empanalyze_table.sql
SELECT 'analyze table '||table_name||' compute statistics;' from user_tables;
spool off
spool d: empanalyze_index.sql
SELECT 'analyze index '||index_name||' compute statistics;' from user_indexes;
spool off
上面的SQL將對我們的表和索引產生批量的SQL,我們再執行這些SQL就行了。
OK,這些就是ORACLE的優化機理和我們人為的影響了,相信大家明白了,希望對大家有所幫助。