1. 程式人生 > >用EXPLAIN PLAN 分析SQL語句

用EXPLAIN PLAN 分析SQL語句

如何生成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會返回一個錯誤。 

相關推薦

EXPLAIN PLAN 分析SQL語句

如何生成explain plan?   解答:執行utlxplan.sql. 建立plan 表   針對特定SQL語句,使用 explain plan set statement_id = 'tst1' into plan_table   執行utlxplp.sql 或 ut

explain來解析sql語句,然後建立正確的索引

用explain mysql中來解析sql語句是一個非常好用的工具,它可以檢視你的sql語句的執行是直接全部掃描,還是經過索引優化的。用它來分析sql語句也可以避免一些無用的索引。下面來看一個例子: 用sql來查詢表中是否有匹配的a或者b(一共180w條記錄)第一版: 一條

explain 分析sql語句

ons 信息 提高 循環 訪問 dev har group by tro https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247485618&idx=1&sn=ed892f572b81e6

explain分析SQL語句詳解

效能分析explain  MySql Query Optimizer是MySql中專門負責優化select語句的優化器模組,主要功能:通過計算分析系統中收集到的系統資訊,為客戶端請求的Query提供他認為最優的執行計劃(系統認為最優的資料檢索方式,但不見得是DBA認為最優的,這部分最耗費時間) MySQL常

mysql優化–explain分析sql語句執行效率

  Explain命令在解決資料庫效能上是第一推薦使用命令,大部分的效能問題可以通過此命令來簡單的解決,Explain可以用來檢視SQL語句的執行效 果,可以幫助選擇更好的索引和優化查詢語句,寫出更好的優化語句。 Explain語法:explain select … from …

Mysql explain分析sql語句執行效率

mysql優化–explain分析sql語句執行效率 Explain命令在解決資料庫效能上是第一推薦使用命令,大部分的效能問題可以通過此命令來簡單的解決,Explain可以用來檢視SQL語句的執行效 果,可以幫助選擇更好的索引和優化查詢語句,寫出更好的優化語句。 Explain語法:explain sel

Explain分析sql語句執行效率

使用Explain命令會有以下屬性輸出:        1》id:這是SELECT的查詢序列號        2》select_type:select_type就是select的型別:   &n

mysql優化(三)–explain分析sql語句執行效率

mushu 釋出於 11個月前 (06-04) 分類:Mysql 閱讀(651) 評論(0) Explain命令在解決資料庫效能上是第一推薦使用命令,大部分的效能問題可以通過此命令來簡單的解決,Explain可以用來檢視SQL語句的執行效 果,可以幫助選擇更好的索引和優化查詢語句,寫出

MySQL 使用explain分析sql語句的查詢效率

Explain命令在解決資料庫效能上是第一推薦使用命令,大部分的效能問題可以通過此命令來簡單的解決,Explain可以用來檢視SQL語句的執行效 果,可以幫助選擇更好的索引和優化查詢語句,寫出更好的優化語句。Explain語法:EXPLAIN tbl_name或:EXPLAI

explain 分析sql語句欄位的解釋

+----+-------------+-------+------------+------+---------------+-----+---------+------+------+----------+-------+ | id | select_typ

MySQL 使用explain分析sql語句的查詢效率(一)

MySQL explain用於分析sql 語句的執行及資料庫索引的使用。本文將致力於幫助大家充分理解explain所返回的各項引數,從而使大家快速掌握explain用法技巧。如果你在看其他教程或視訊後仍覺得雲裡霧裡。那麼請通讀本文。 用法 explain的用法相當簡潔

MySQL 使用explain分析sql語句的查詢效率(二)

本文將繼續上文講解其他與效率相關的引數 explain所返回的其他引數key為使用的索引,而使用的索引又影響著連線型別type,它們共同決定了可能掃描行數rows 引數解析 (4)type (重點) 聯接型別。查詢效率的關鍵,下面按照從最佳型

利用EXPLAIN分析sql語句的效能

使用explain關鍵字可以模擬優化器執行SQL查詢語句,從而知道MySQL是如何處理你的sql語句,可以幫助選擇更好的索引和寫出更優化的查詢語句。。 使用explain我看可以sql執行的相關資訊: 表的讀取順序 資料讀取操作的操作型別 哪些索引可以使用

mysql 慢日誌開啟 及explain 分析sql語句

檢視當前資料庫是否開啟了日誌: mysql > show variables like 'log_%'; mysql 的日誌型別有以下幾種: +---------------------------------+----------------------------

Explain 命令分析 MySQL 的 SQL 執行

在上一篇文章[《MySQL常見加鎖場景分析》](https://mp.weixin.qq.com/s/oJWDrNTLeDR8KYRKfn-f8g)中,我們聊到行鎖是加在索引上的,但是複雜的 SQL 往往包含多個條件,涉及多個索引,找出 SQL 執行時使用了哪些索引對分析加鎖場景至關重要。 比如下面這樣的

SQLServer數據庫,表內存,實例名分析SQL語句

right log space _id 數據庫 con sys case sharp --數據庫內存分析 USE master go DECLARE @insSize TABLE(dbName sysname,checkTime VARCHAR(19),dbSize VA

7.使用EXPLAIN分析SQL和表結構_2

數據行 影響 位置 一行 nbsp temp 使用 null 字段 possible_keys ------ 顯示可能應用在這張表的索引,一個或多個           查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被實際查詢使用 key -----

VBA POST 調網頁API 格式化SQL語句

att func get string call http fun mic class 工作中遇到一個場景,需要用VBA把SQL語句重新美觀格式化一下,本來想直接調用本地的SQLWORKBENCH工具來實現這一功能,無奈找不到command參數,不能被VBA直接調用,作罷.

MySQL創建戶,常用SQL語句以及數據庫備份與恢復

mysql常用命令 恢復與備份 一、創建普通用戶並授權 1、創建用戶並授權 [root@zlinux ~]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your

MySQL戶管理及SQL語句詳解

shel row 不能 mode form lte entos 本體 lin 1.1 MySQL用戶管理 1.1.1 用戶的定義   用戶名+主機域 mysql> select user,host,password from mysql.user; +--