Oracle最佳化器和執行計畫

來源:互聯網
上載者:User

標籤:style   c   int   a   資料   使用   

1. 最佳化器(Optimizer)是sql分析和執行的最佳化工具,它負責制定sql的執行計畫,負責保證sql執行效率最高,比如決定oracle以什麼方式訪問資料,全表掃描(full table scan)還是索引範圍(index range scan)掃描,還是全索引快速掃描(index fast full scan, INDEX_FFS),對於表關聯查詢,是用什麼方式關聯。有2種最佳化器,RBO和CBO,從oracle 10g開始,RBO已經被棄用,但是仍可以通過hint的方式使用。

2. RBO執行機制:在最佳化器裡嵌入若干種規則,執行的sql符合什麼規則,則按照規則制定執行計畫,這些規則是按照優先順序排列。 select /*+ rule */ * from t where id=1; 使用hint方式強制使用RBO最佳化器執行。

3. CBO執行機制:擷取所有執行計畫相關資訊,通過對這些資訊的分析,最後得出一個代價最小的執行計畫作為最終的執行計畫。

4. 即使在表,索引沒有被分析的時候,oracle仍會使用CBO(從oracle 10g開始,RBO已經被棄用), 此時oracle會使用動態採樣,在分析sql的時候,動態收集表,索引上的一些資料區塊,使用這些資料區塊的資訊及字典中關於這些對象的資訊來計算出執行計畫的代價,進而挑選出最優的執行計畫。動態採樣只有在sql執行的第一次,即硬分析階段使用,後續的軟分析不再使用動態採樣,直接使用第一次sql硬分析出的執行計畫。

5. CBO最佳化器有2種可選的運行模式:

  • FIRST_ROWS(n): oracle在執行sql時,優先考慮將結果集中的前n條記錄以最快的速度反饋回來,其他的結果不需要同時返回。這種需求在搜尋或分頁經常看到。

select /*+ first_rows(10) */ b.x, b.y

from (select /*+ first_rows(10) */ a.*, rownum rnum

from (select /*+ first_rows(10) */ * from t order by x) a where rownum<=20)

b where rnum>=10;

  • ALL_ROWS:將sql執行完畢將結果集全部返回。

select /*+ all_rows */ *

from (select /*+ all_rows */ a.*, rownum r

from (select /*+ all_rows */ owner, object_name, created from t where owner=‘sys‘ order by object_name) a where rownum<=20)

where r>=10;

6. 執行計畫中的基數(Cardinality): 執行計畫每一步操作中,Card的值表示CBO預期從一個行源row source返回的記錄數,這個行源可能是一個表,一個索引,也可能是一個子查詢。

執行計畫中card就是Cardinality的縮寫,在10g以後,card被rows替換,表示CBO估算當前操作預期擷取的記錄數。Cardinality的值對應CBO做出正確的執行計畫至關重要。

/*+ dynamic_sampling(t 0) cardinality(t 10000) */ 在未分析資料的前提下,禁止動態採樣並告訴CBO從t表將擷取到10000條記錄。

7. 執行計畫可以使用如下方式得到:

  • explain plan for 如:1.explain plan for select * from t; 2. select * from table(dbms_xplan.display);
  • sqlplus命令 set autotrace on; set autotrace trace exp, stat;
  • 第三方提供的工具,如Toad,PL/SQL developer

8. 執行計畫中的access表示這個謂詞條件的值將會影響資料的訪問路徑(表還是索引),filter表示謂詞條件的值並不會影響資料的訪問路徑,只起到過濾的作用。

9. 如果表沒有做分析,那麼CBO可以通過動態採樣的方式獲得分析資料,也可以獲得準確的執行計畫;如果表分析過,但是分析資訊過舊,這時候CBO不會使用動態採樣,而是使用這些舊的分析資料,從而可能導致錯誤的執行計畫。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.