<strike id="j6ksu"></strike>
<th id="j6ksu"></th>
  1. <th id="j6ksu"></th>

    Oracle數據庫SQL執行計劃怎么查看?如何分析?

    Oracle 潘老師 5天前 35 ℃ (0) 掃碼查看

    數據庫SQL執行的效率會直接影響整體應用的性能,在大數據量和復雜SQL語句的情況下,一定要查看數據庫SQL的執行計劃,并分析哪些語句耗費較多,值得優化!就Oracle數據庫而言,下面潘老師來談談我們該如何去查詢和分析執行計劃?

    一、什么是SQL執行計劃

    執行計劃(explain plan)是指:一條查詢語句在數據庫中的執行過程或訪問路徑的描述。

    二、Oracle數據庫如何查看SQL執行計劃

    1)PLSQL工具查看方式
    Oracle數據庫查看SQL執行計劃可以通過客戶端工具快速實現,比如使用plsql直接快捷鍵F5或者點擊菜單:工具->解釋計劃都可以查看對應的SQL的執行計劃,效果類似如下:
    Oracle數據庫SQL執行計劃怎么查看?如何分析?
    另外PLSQL的默認顯示首選項參數比較少,可以點擊圖中的首選項來配置:
    Oracle數據庫SQL執行計劃怎么查看?如何分析?
    2)Navicat For Oracle查看方式
    Navicat 可以直接點擊右上角的Explain就可以查看
    Oracle數據庫SQL執行計劃怎么查看?如何分析?
    3)SQL-PLUS可以使用如下sql語句進行查看

    # 解釋計劃
    EXPLAIN PLAN FOR ELECT * FROM TEST_TABLE; --要解析的SQL腳本
    # 查看解釋計劃
    SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
    

    三、SQL執行計劃常用概念解釋

    1、說明一下部分相關概念
    相比較而言還是plsql較為好用,以plsql為例。
    1)基數(Rows):Oracle估計的當前操作的返回結果集行數
    2)字節(Bytes):執行該步驟后返回的字節數
    3)耗費(Cost)、CPU耗費:Oracle估計的該步驟的執行成本,用于說明SQL執行的代價,理論上越小越好(該值可能與實際有出入)
    4)時間(Time):Oracle估計的當前操作所需的時間
    5)訪問謂詞:where后面的查詢條件

    2、執行順序
    在plsql中我們可以使用圖中的箭頭直接來調試執行順序,非常方便,像Navicat沒有就可以根據據Operation縮進來判斷,縮進最多的最先執行(當縮進相同時,最上面的最先執行),同一級如果某個動作沒有子ID就最先執行,同一級的動作執行時遵循最上最右先執行的原則。

    3、一些動作的解釋
    如plsql那張圖中類似INDEX RANGE SCANTABLE ACCESS FULL等等,即描述的是該動作執行時表訪問(或者說Oracle訪問數據)的方式;

    常見的幾種表訪問方式:
    TABLE ACCESS FULL:全表掃描
    TABLE ACCESS BY ROWID:通過ROWID的表存取
    TABLE ACCESS BY INDEX SCAN:索引掃描

    1)全表掃描:
    Oracle會讀取表中所有的行,并檢查每一行是否滿足SQL語句中的 Where 限制條件;全表掃描時可以使用多塊讀(即一次I/O讀取多塊數據塊)操作,提升吞吐量;
    使用建議:數據量太大的表不建議使用全表掃描,除非本身需要取出的數據較多,占到表數據總量的 5% ~ 10% 或以上。

    2)通過ROWID的表存取
    ROWID是由Oracle自動加在表中每行最后的一列偽列,既然是偽列,就說明表中并不會物理存儲ROWID的值,你可以像使用其它列一樣使用它,只是不能對該列的值進行增、刪、改操作,一旦一行數據插入后,則其對應的ROWID在該行的生命周期內是唯一的,即使發生行遷移,該行的ROWID值也不變。

    讓我們再回到 TABLE ACCESS BY ROWID 來:行的ROWID指出了該行所在的數據文件、數據塊以及行在該塊中的位置,所以通過ROWID可以快速定位到目標數據上,這也是Oracle中存取單行數據最快的方法;

    3)索引掃描
    在索引塊中,既存儲每個索引的鍵值,也存儲具有該鍵值的行的ROWID。掃描其實分為兩步:
    Ⅰ:掃描索引得到對應的ROWID
    Ⅱ:通過ROWID定位到具體的行讀取數據

    索引掃描又分五種:
    INDEX UNIQUE SCAN:索引唯一掃描
    INDEX RANGE SCAN:索引范圍掃描
    INDEX FULL SCAN:索引全掃描
    INDEX FAST FULL SCAN:索引快速掃描
    INDEX SKIP SCAN:索引跳躍掃描

    a) INDEX UNIQUE SCAN(索引唯一掃描):

    針對唯一性索引(UNIQUE INDEX)的掃描,每次至多只返回一條記錄;表中某字段存在 UNIQUE、PRIMARY KEY 約束時,Oracle常實現唯一性掃描;

    b) INDEX RANGE SCAN(索引范圍掃描):

    使用一個索引存取多行數據;發生索引范圍掃描的三種情況:

      在唯一索引列上使用了范圍操作符(如:> < <> >= <= between) 在組合索引上,只使用部分列進行查詢(查詢時必須包含前導列,否則會走全表掃描) 對非唯一索引列上進行的任何查詢[/list] c) INDEX FULL SCAN(索引全掃描):
      進行全索引掃描時,查詢出的數據都必須從索引中可以直接得到(注意全索引掃描只有在CBO模式下才有效)
      d) INDEX FAST FULL SCAN(索引快速掃描):
      掃描索引中的所有的數據塊,與 INDEX FULL SCAN 類似,但是一個顯著的區別是它不對查詢出的數據進行排序(即數據不是以排序順序被返回)
      e) INDEX SKIP SCAN(索引跳躍掃描):
      Oracle 9i后提供,有時候復合索引的前導列(索引包含的第一列)沒有在查詢語句中出現,oralce也會使用該復合索引,這時候就使用的INDEX SKIP SCAN;
      大概怎么用
      當然還有一些表連接方式的動態在此就不再展開了,我們在優化SQL時重要的一步就是盡量避免了全表掃描,查看SQL是否命中索引,優化COST較大的執行步驟!

      以上就是Oracle數據庫SQL執行計劃怎么查看分析的內容,至于具體怎么優化SQL以后再說。


      版權聲明:本站所有文章,如無特殊說明,均為本站原創。全部下載資源版權歸原作者所有。任何個人或組織,若未征得本站同意,禁止復制、盜用、采集、發布本站內容到任何網站、書籍等各類媒體平臺。若需轉載請注明文章來源。
      本文鏈接:Oracle數據庫SQL執行計劃怎么查看?如何分析?
      喜歡 (0)
      請潘老師喝杯Coffee吧!】
      分享 (0)
      用戶頭像
      發表我的評論
      取消評論
      表情 貼圖 簽到 代碼

      Hi,您需要填寫昵稱和郵箱!

      • 昵稱【必填】
      • 郵箱【必填】
      • 網址【可選】

      您也可以 微信登錄 來發表評論!

      韩国毛茸茸的丰满妇女