The important thing in life is to have a great aim , and the determination

          常用鏈接

          統(tǒng)計

          IT技術(shù)鏈接

          保險相關(guān)

          友情鏈接

          基金知識

          生活相關(guān)

          最新評論

          執(zhí)行計劃的使用(EXPLAIN)

          對于sql執(zhí)行的小量高低。我們可以通過執(zhí)行計劃的信息基本上可以進(jìn)行分析查看該SQL語句執(zhí)行的時間。連接順序及浪費的數(shù)據(jù)庫資源等信息,從而判斷該SQL語句執(zhí)行的效率如何,下面就簡單的介紹一下執(zhí)行計劃的使用

            2.        Explain使用

            Oracle RDBMS執(zhí)行每一條SQL語句,都必須經(jīng)過Oracle優(yōu)化器的評估。所 以,了解優(yōu)化器是如何選擇(搜索)路徑以及索引是如何被使用的,對優(yōu)化SQL語句有很大的幫助。Explain可以用來迅速方便地查出對于給定SQL語句中的查詢數(shù)據(jù)是如何得到的即搜索路徑(我們通常稱為Access Path)。從而使我們選擇最優(yōu)的查詢方式達(dá)到最大的優(yōu)化效果。

            2.1.        安裝

            要使用執(zhí)行計劃首先需要執(zhí)行相應(yīng)的腳本。

            使用Explain工具需要創(chuàng)建Explain_plan表,這必須先進(jìn)入相關(guān)應(yīng)用表、視圖和索引的所有者的帳戶內(nèi)。Oracle的介質(zhì)中包含有執(zhí)行此項工作的SQL源程序,例如:

            ORA_RDBMS: XPLAINPL.SQL (VMS)

            $ORACLE_HOME/rdbms/admin/utlxplan.sql (UNIX)

            該腳本后會生成一個表這個程序會創(chuàng)建一個名為plan_table的表,表結(jié)構(gòu)如下:

            我們簡單的介紹一下主要的字段含義:

          字段名              字段類型            含義
          STATEMENT_ID    VARCHAR2(30)        explain PLAN 語句中所指定的最優(yōu)STATEMENT_ID 參數(shù)值, 如果在EXPLAN PLAN語句中沒有使用SET STATEMENT_ID,那么此值會被設(shè)為NULL。
          REMARKS         VARCHAR2(80)        與被解釋規(guī)劃的各步驟相關(guān)聯(lián)的注釋最長可達(dá)80 字節(jié)
          OPERATION       VARCHAR2(30)        各步驟所執(zhí)行內(nèi)部操作的名稱在某條語句所產(chǎn)生的第一行中該列的可能取值如下DELETE STATEMENT INSERT STATEMENT SELECT STATEMENT UPDATE STATEMENT
          OPTIONS         VARCHAR2(30)        對OPERATION 列中所描述操作的變種
          OBJECT_NODE     VARCHAR2(128)       用于訪問對象的數(shù)據(jù)庫鏈接database link 的名稱對于使用并行執(zhí)行的本地查詢該列能夠描述操作中輸出的次序
          OBJECT_OWNER    VARCHAR2(30)        對于包含有表或索引的架構(gòu)schema 給出其所有者的名稱
          OBJECT_NAME     VARCHAR2(30)        表或索引的名稱
          OBJECT_INSTANCE  INTEGER            根據(jù)對象出現(xiàn)在原始o(jì)riginal 語句中的次序所給出的相應(yīng)次序編號就原始的語句文本而論其處理順序為自左至右自外向內(nèi)景象擴(kuò)張view
          OBJECT_TYPE     VARCHAR2(30)        用于提供對象描述性信息的修飾符例如索引的NON-UNIQUE
          OPTIMIZER       VARCHAR2(255)       當(dāng)前優(yōu)化程序的模式
          ID              INTEGER             分配給執(zhí)行規(guī)劃各步驟的編號
          PARENT_ID       INTEGER             對ID 步驟的輸出進(jìn)行操作的下一個執(zhí)行步驟的ID
          POSITION        INTEGER             對于具有相同PARENT_ID 的步驟其相應(yīng)的處理次序
          COST            INTEGER             根據(jù)優(yōu)化程序的基于開銷的方法所估計出的操作開銷值對于使用基于規(guī)則方法的語句該列為空該列值沒有特定的測量單位它只是一個用于比較執(zhí)行規(guī)劃開銷大小的權(quán)重值
          CARDINALITY     INTEGER             根據(jù)基于開銷的方法對操作所訪問行數(shù)的估計值
          BYTES           INTEGER             根據(jù)基于開銷的方法對操作所訪問字節(jié)的估計

            2.2.        使用

            2.2.1.        常規(guī)使用

            常規(guī)使用語法:

          explain PLAN [ SET STATEMENT_ID [=] < string literal > ]
          [ INTO < table_name > ]
          FOR < sql_statement >
          其中:
          STATEMENT_ID是一個唯一的字符串,把當(dāng)前執(zhí)行計劃與存儲在同一PLAN表中的其它執(zhí)行計劃區(qū)別開來。
          TABLE_NAME是plan表名,它結(jié)構(gòu)如前所示,你可以任意設(shè)定這個名稱。
          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

            執(zhí)行下面語句就可以查看該語句執(zhí)行的執(zhí)行計劃:

          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中自動跟蹤顯示執(zhí)行計劃及相關(guān)信息
            SQL>set timing on  --顯示執(zhí)行時間
            SQL>set autorace on ?C顯示執(zhí)行計劃
            SQL>set autorace on ?C顯示執(zhí)行計劃
            SQL>set autotrace traceonly ?C只顯示執(zhí)行計劃即不顯示查詢出來的數(shù)據(jù)

            設(shè)置完畢后執(zhí)行SQL語句就會顯示執(zhí)行計劃信息及相應(yīng)的統(tǒng)計信息(需要設(shè)置顯示該選項)

          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 --循環(huán)遞歸次數(shù)
                    0  db block gets―請求的數(shù)據(jù)塊在buffer能滿足的個數(shù)
                 6675  consistent gets --邏輯IO用于讀表并計算行數(shù), 數(shù)據(jù)請求總數(shù)在回滾段Buffer中
                   45  physical reads ?C從磁盤讀到Buffer Cache數(shù)據(jù)塊數(shù)量
                    0  redo size ?C產(chǎn)生的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用于讀表并計算行數(shù), 數(shù)據(jù)請求總數(shù)在回滾段Buffer中

            45        physical reads ?C從磁盤讀到Buffer Cache數(shù)據(jù)塊數(shù)量的數(shù)值比較小則該語句對對數(shù)據(jù)庫的性能比較高。

            2.2.3.        PL/SQL和TOAD中使用

            如果在PL/SQL中使用選擇要查詢語句顯示執(zhí)行計劃,則只需要SQL WINDOWS 窗口里面輸入要查詢的SQL語句,然后選擇按鍵F5或者在菜單TOOLS?D?D>Explain Plan 菜單按鍵就可以在執(zhí)行計劃窗口查看該語句的執(zhí)行計劃。

            在TOAD語句中在執(zhí)行當(dāng)前的SQL窗口中選擇下方的Explain PlanTAB頁即可以查看要執(zhí)行語句的執(zhí)行計劃信息。

            2.3.        限制

            雖然任何SQL語句都可以用explain解釋,但對于沒有查詢的INSERT,UPDATE,DELETE操作來說,這個工具并沒有太大的用處。沒有子查詢的INSERT操作不會創(chuàng)建執(zhí)行計劃,但沒有WHERE子句或子查詢的UPDATE和DELETE操作會創(chuàng)建執(zhí)行計劃,因為這些操作必須先找出所要的記錄。

            另外,如果你在SQL語句中使用其它類型如sequence等,explain也能揭示它的用法。

            explain真正的唯一的限制是用戶不能去解釋其它用戶的表,視圖,索引或其它類型,用戶必須是所有被解釋事物的所有者,如果不是所有者而只有select權(quán)限,explain會返回一個錯誤。

          posted on 2014-05-03 11:36 鴻雁 閱讀(147) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

          主站蜘蛛池模板: 平和县| 泸水县| 阜平县| 开化县| 朝阳区| 巢湖市| 开远市| 西乌| 阿拉尔市| 靖安县| 德州市| 佛冈县| 开远市| 楚雄市| 张掖市| 旬邑县| 罗定市| 长丰县| 尉犁县| 加查县| 丹寨县| 益阳市| 竹山县| 翁牛特旗| 浪卡子县| 武义县| 勐海县| 泽州县| 综艺| 泗水县| 永德县| 曲周县| 凤凰县| 堆龙德庆县| 抚顺县| 安阳县| 南召县| 上饶县| 常宁市| 武城县| 盱眙县|