久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    【轉】用EXPLAINPLAN分析SQL語句

     汲取者 2010-06-14

    轉載  【轉】 用EXPLAIN PLAN 分析SQL語句 收藏

    用EXPLAIN PLAN 分析SQL語句

    http://blog.csdn.net/kj021320/archive/2006/08/19/1096021.aspx

    如何生成explain plan?
      解答:運行utlxplan.sql. 建立plan 表

      針對特定SQL語句,使用 explain plan set statement_id = 'tst1' into plan_table

      運行utlxplp.sql 或 utlxpls.sql察看explain plan


    EXPLAIN PLAN 是一個很好的分析SQL語句的工具,它甚至可以在不執行SQL的情況下分析語句. 通過分析,我們就可以知道ORACLE是怎么樣連接表,使用什么方式掃描表(索引掃描或全表掃描)以及使用到的索引名稱.

    你需要按照從里到外,從上到下的次序解讀分析的結果. EXPLAIN PLAN分析的結果是用縮進的格式排列的, 最內部的操作將被最先解讀, 如果兩個操作處于同一層中,帶有最小操作號的將被首先執行.

    NESTED LOOP是少數不按照上述規則處理的操作, 正確的執行路徑是檢查對NESTED LOOP提供數據的操作,其中操作號最小的將被最先處理.


    譯者按:

    通過實踐, 感到還是用SQLPLUS中的SET TRACE 功能比較方便.

    舉例:


    SQL> list

    1 SELECT *

    2 FROM dept, emp

    3* WHERE emp.deptno = dept.deptno

    SQL> set autotrace traceonly /*traceonly 可以不顯示執行結果*/

    SQL> /

    14 rows selected.

    Execution Plan

    ----------------------------------------------------------

    0 SELECT STATEMENT Optimizer=CHOOSE

    1 0 NESTED LOOPS

    2 1 TABLE ACCESS (FULL) OF 'EMP'

    3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'

    4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)


    Statistics

    ----------------------------------------------------------

    0 recursive calls

    2 db block gets

    30 consistent gets

    0 physical reads

    0 redo size

    2598 bytes sent via SQL*Net to client

    503 bytes received via SQL*Net from client

    2 SQL*Net roundtrips to/from client

    0 sorts (memory)

    0 sorts (disk)

    14 rows processed


    通過以上分析,可以得出實際的執行步驟是:

    1. TABLE ACCESS (FULL) OF 'EMP'

    2. INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)

    3. TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'

    4. NESTED LOOPS (JOINING 1 AND 3)

    注: 目前許多第三方的工具如TOAD和ORACLE本身提供的工具如OMS的SQL Analyze都提供了極其方便的EXPLAIN PLAN工具.也許喜歡圖形化界面的朋友們可以選用它們.
    ----------------------------------------------------------------------------


    對于sql執行的小量高低.我們可以通過執行計劃的信息基本上可以進行分析查看該SQL語句執行的時間.連接順序及浪費的數據庫資源等信 息,從而判斷該SQL語句執行的效率如何,下面就簡單的介紹一下執行計劃的使用
    2.        Explain使用
    Oracle RDBMS執行每一條SQL語句,都必須經過Oracle優化器的評估。所 以,了解優化器是如何選擇(搜索)路徑以及索引是如何被使用的,對優化SQL語句有很大的幫助。Explain可以用來迅速方便地查出對于給定SQL語句 中的查詢數據是如何得到的即搜索路徑(我們通常稱為Access Path)。從而使我們選擇最優的查詢方式達到最大的優化效果。
    2.1.        安裝
    要使用執行計劃首先需要執行相應的腳本。
    使用Explain工具需要創建Explain_plan表,這必須先進入相關應用表、視 圖和索引的所有者的帳戶內。Oracle的介質中包含有執行此項工作的SQL源程序,例如:
    ORA_RDBMS: XPLAINPL.SQL (VMS)
    $ORACLE_HOME/rdbms/admin/utlxplan.sql (UNIX)
    該腳本后會生成一個表這個程序 會創建一個名為plan_table的表,表結構如下:
    我們簡單的介紹一下主要的字段含義:
    字段名        字段類型        含義
    STATEMENT_ID        VARCHAR2(30)        explain PLAN 語句中所指定的最優STATEMENT_ID 參數值, 如果在EXPLAN PLAN語句中沒有使用SET STATEMENT_ID,那么此值會被設為NULL。  
    REMARKS        VARCHAR2(80)        與被解釋規劃的各步驟相關聯的注釋最長可達80 字節
    OPERATION        VARCHAR2(30)        各步驟所執行內部操作的名稱在某條語句所產生的第一行中該列的可能取值如下DELETE STATEMENT INSERT STATEMENT SELECT STATEMENT UPDATE STATEMENT
    OPTIONS        VARCHAR2(30)        對OPERATION 列中所描述操作的變種
    OBJECT_NODE        VARCHAR2(128)        用于訪問對象的數據庫鏈接database link 的名稱對于使用并行執行的本地查詢該列能夠描述操作中輸出的次序
    OBJECT_OWNER        VARCHAR2(30)        對于包含有表或索引的架構schema 給出其所有者的名稱
    OBJECT_NAME        VARCHAR2(30)        表或索引的名稱
    OBJECT_INSTANCE        INTEGER        根據對象出現在原始original 語句中的次序所給出的相應次序編號就原始的語句文本而論其處理順序為自左至右自外向內景象擴張view
    OBJECT_TYPE        VARCHAR2(30)        用于提供對象描述性信息的修飾符例如索引的NON-UNIQUE
    OPTIMIZER        VARCHAR2(255)        當前優化程序的模式
    ID        INTEGER        分配給執行規劃各步驟的編號
    PARENT_ID        INTEGER        對ID 步驟的輸出進行操作的下一個執行步驟的ID
    POSITION        INTEGER        對于具有相同PARENT_ID 的步驟其相應的處理次序
    COST        INTEGER        根據優化程序的基于開銷的方法所估計出的操作開銷值對于使用基于規則方法的語句該列為空該列值沒有特定的測量單位它只是一個用于比較執行規劃開銷大小的權 重值
    CARDINALITY        INTEGER        根據基于開銷的方法對操作所訪問行數的估計值
    BYTES        INTEGER        根據基于開銷的方法對操作所訪問字節的估計

    2.2.        使用
    2.2.1.        常規使用
    常規使用語法:
    explain PLAN [ SET STATEMENT_ID [=] < string literal > ]
    [ INTO < table_name > ]
    FOR < sql_statement >
    其中:
    STATEMENT_ID是一個唯一的字符 串,把當前執行計劃與存儲在同一PLAN表中的其它執行計劃區別開來。
    TABLE_NAME是plan表名,它結構如前所示,你可以任意設定這 個名稱。
    SQL_STATEMENT是真正的SQL語句。
    如:
    SQL> explain plan set statement_id='test1' for 
      2     SELECT a.soctermbegin,
      3            a.soctermend,
      4            a.dealserialno,
      5            a.levydataid,
      6            a.dealtotal,
      7            e.categoryitemcode,
      8            row_number() over(PARTITION BY a.levydataid ORDER BY 1) AS theRow
      9       FROM tb_soc_packdealdata   a,
    10            tb_Lvy_TaxDataBillMap c,
    11            Tb_lvy_BillData       d,
    12            tb_soc_levydetaildata e
    13      WHERE a.levydataid = c.datafrompointer(+)
    14        AND c.billdataid = d.billdataid(+)
    15        AND a.levydataid = e.levydataid
    16        AND a.packdealstatuscode = '10'
    17        AND (a.datastatus <> '9' OR a.datastatus is NULL)
    18        AND (d.billstatus IS NULL OR
    19            (d.billstatus <> '2' AND d.billstatus <> '8'))
    20        AND a.Insurcode = '6010952'
    21  ;
    Explained
    執行下面語句就可以查看該語句執行的執 行計劃:
    SQL> SELECT A.OPERATION,OPTIONS,OBJECT_NAME,OBJECT_TYPE,ID,PARENT_ID
      2  FROM PLAN_TABLE  a
      3  WHERE STATEMENT_ID='test1'
      4  ORDER BY Id;
    OPERATION        OPTIONS        OBJECT_NAME                    OBJECT_TYPEID  PARENT_ID
    ---------------- --------------------------------------------- ------------- ----------
    SELECT STATEMENT                                                           0
    WINDOW           SORT                                                      1          0
    FILTER                                                                     2          1
    NESTED LOOPS     OUTER                                                     3          2
    NESTED LOOPS     OUTER                                                     4          3
    NESTED LOOPS                                                               5          4
    TABLE ACCESS     FULL           TB_SOC_PACKDEALDATA                        6          5
    TABLE ACCESS     BY INDEX ROWID TB_SOC_LEVYDETAILDATA                      7          5
    INDEX            RANGE SCAN     IND_DATAID_LEVSOC              NON-UNIQUE  8          7
    TABLE ACCESS     BY INDEX ROWID TB_LVY_TAXDATABILLMAP                      9          4
    INDEX            RANGE SCAN     TBLVYTAXDATABIL_DATAFROMPOINTE NON-UNIQUE 10          9
    TABLE ACCESS     BY INDEX ROWID TB_LVY_BILLDATA                           11          3
    INDEX            UNIQUE SCAN    TBLVYBILLDATA_BILLDATAID       UNIQUE  
    2.2.2.        自動顯示使用
    在 SQLPLUS中自動跟蹤顯示執行計劃及相關信息
    SQL>set timing on  --顯示執行時間
    SQL>set autorace on ?C顯示執行計劃
    SQL>set autorace on ?C顯示執行計劃
    SQL>set autotrace traceonly ?C只顯示執行計劃即不顯示查詢出來的數據
    設置完畢后執行SQL語句就會顯示執行計劃信息及相應的統計 信息(需要設置顯示該選項)
    SQL> select nvl(sum(t.taxdue), 0)
      2             from tb_lvy_sbzs100 t, tb_lvy_declaredoc a, tb_lvy_declaredoc b
      3            where a.dossiercode = 'SB02041108'
      4              and a.pages = 123
      5              and a.remarkid = b.remarkid
      6              AND A.REMARKID IS NOT NULL
      7              and b.declaredocid = t.declaredocid;
    NVL(SUM(T.TAXDUE),0)
    --------------------
                       0
    已用時間:  00: 00: 04.07
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=1 Bytes=110)
       1    0   SORT (AGGREGATE)
       2    1     NESTED LOOPS (Cost=6 Card=1 Bytes=110)
       3    2       MERGE JOIN (CARTESIAN) (Cost=4 Card=1 Bytes=74)
       4    3         TABLE ACCESS (FULL) OF 'TB_LVY_SBZS100' (Cost=2 Card =1 Bytes=31)
       5    3         BUFFER (SORT) (Cost=2 Card=1 Bytes=43)
       6    5           TABLE ACCESS (FULL) OF 'TB_LVY_DECLAREDOC' (Cost=2 Card=1 Bytes=43)
       7    2       TABLE ACCESS (BY INDEX ROWID) OF 'TB_LVY_DECLAREDOC' (Cost=2 Card=1 Bytes=36)
       8    7         INDEX (UNIQUE SCAN) OF 'TBLVYDECLAREDOC_DECLAREDOCID' (UNIQUE)
    Statistics
    ----------------------------------------------------------
              0  recursive calls --循環遞歸次數
              0  db block gets―請求的數據塊在buffer能滿足的個數
           6675  consistent gets --邏輯IO用于讀表并計算行數, 數據請求總數在回滾段Buffer中
             45  physical reads ?C從磁盤讀到Buffer Cache數據塊數量
              0  redo size ?C產生的redo日志大小
            217  bytes sent via SQL*Net to client
            276  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
              1  rows processed
    SQL>
    如果6675  consistent gets --邏輯IO用于讀表并計算行數, 數據請求總數在回滾段Buffer中
    45        physical reads ?C從磁盤讀到Buffer Cache數據塊數量
    的數值比較小則該語句對對數據庫的性能比較高。

    2.2.3.        PL/SQL和TOAD中使用
    如果在PL/SQL中使用選擇要查詢語句顯示執行計劃,則只需要SQL WINDOWS 窗口里面輸入要查詢的SQL語句,然后選擇按鍵F5或者在菜單TOOLS?D?D>Explain Plan 菜單按鍵就可以在執行計劃窗口查看該語句的執行計劃。
    在TOAD語句中在執行當前的SQL窗口中選擇下方的Explain PlanTAB頁即可以查看要執行語句的執行計劃信息。
    2.3.        限制
    雖然任何SQL語句都可以用explain解釋,但 對于沒有查詢的INSERT,UPDATE,DELETE操作來說,這個工具并沒有太大的用處。沒有子查詢的INSERT操作不會創建執行計劃,但沒有 WHERE子句或子查詢的UPDATE和DELETE操作會創建執行計劃,因為這些操作必須先找出所要的記錄。
    另外,如果你在SQL語句中使用 其它類型如sequence等,explain也能揭示它的用法。
    explain真正的唯一的限制是用戶不能去解釋其它用戶的表,視圖,索引或其 它類型,用戶必須是所有被解釋事物的所有者,如果不是所有者而只有select權限,explain會返回一個錯誤。

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 强奷漂亮人妻系列老师| 日韩国产成人精品视频| 国精产品一区二区三区有限公司 | 国产69精品久久久久777| 国产仑乱无码内谢| 国产在线午夜不卡精品影院 | 成在人线AV无码免观看| 精品人人妻人人澡人人爽人人| 极品尤物被啪到呻吟喷水| 久久这里只精品国产免费9| 国产成人AV三级在线观看按摩| 国产亚洲精品第一综合另类无码无遮挡又大又爽又黄的视频 | 亚洲AV成人中文无码专区 | 国产精品中文字幕在线| 国产亚洲欧美在线观看三区| 影音先锋人妻啪啪AV资源网站| 欧美乱妇高清无乱码免费| 国产高潮刺激叫喊视频| 亚洲综合一区国产精品| 欧美精品一区二区在线观看播放 | 国偷自产一区二区三区在线视频| 久久久国产乱子伦精品| 高清自拍亚洲精品二区| 不卡高清AV手机在线观看| 无码国内精品久久人妻蜜桃| 高清无码一区二区在线观看| 奇米四色7777中文字幕| 少妇太爽了在线观看免费视频 | 久久久亚洲AV成人网站| 男女动态无遮挡动态图| 欧洲人妻丰满AV无码久久不卡| 日韩人妻中文字幕精品| 国产真人无码作爱视频免费 | 东京热人妻丝袜无码AV一二三区观| 欧美成人精品一区二区综合| 99久久婷婷国产综合精品青草漫画 | 成人国产片视频在线观看| 推油少妇久久99久久99久久| 国产良妇出轨视频在线观看| 成人网站免费观看永久视频下载 | 久久久这里只有免费精品|