程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 監控 DB2 活動之使用解釋工具分析SQL(2)

監控 DB2 活動之使用解釋工具分析SQL(2)

編輯:關於SqlServer


  收集解釋數據

  解釋工具由多個單獨的工具組成,而並非所有的工具需要的都是相同類型的解釋數據。因此,可收集兩種不同類型的解釋數據:

  全面解釋數據(Comprehensive explain data)。包含關於一條 SQL 語句的訪問計劃的詳細信息。此信息跨多個不同的解釋表存儲。
  解釋快照數據(Explain snapshot data)。包含一條 SQL 語句的當前內部表示以及所有相關信息。此信息存儲在 EXPLAIN_STATEMENT 解釋表的 SNAPSHOT 列中。
  您或許已經想到,有多種收集這兩種解釋數據的方法。收集解釋數據的可行方法包括:

  執行 EXPLAIN SQL 語句
  設置 CURRENT EXPLAIN MODE 特殊寄存器
  設置 CURRENT EXPLAIN SNAPSHOT 特殊寄存器
  在 PRECOMPILE 或 BIND 命令中使用 EXPLAIN 綁定選項
  在 PRECOMPILE 或 BIND 命令中使用 EXPLSNAP 綁定選項
  EXPLAIN SQL 語句

  為單獨一條動態 SQL 語句收集全面解釋信息和解釋快照數據的方法之一就是執行 EXPLAIN SQL 語句。該語句的基本語法是:

  EXPLAIN [ALL | PLAN | PLAN SELECTION]
  <FOR SNAPSHOT | WITH SNAPSHOT>
  FOR [SQLStatement]

  其中,SQLStatement 表示要為其收集解釋數據和/或解釋快照數據的 SQL 語句。(指定的語句必須是一條有效的 INSERT、UPDATE、DELETE、SELECT、SELECT INTO、VALUES 或 VALUES INTO SQL 語句。)

  若在 EXPLAIN 語句中指定了 FOR SNAPSHOT 選項,則僅為指定動態 SQL 語句收集解釋快照信息。另一方面,若指定的是 WITH SNAPSHOT 選項,則指定動態 SQL 語句的全面解釋信息和解釋快照數據均會被收集。但若未使用任一選項,則僅收集全面解釋數據,而不會產生任何解釋快照數據。

  要為 SQL 語句 SELECT * FROM DEPARTMENT 收集全面解釋數據和解釋快照信息,可像下面這樣執行 EXPLAIN 語句:

  EXPLAIN ALL WITH SNAPSHOT FOR SELECT * FROM DEPARTMENT

  另一方面,如果希望僅為這條 SQL 語句收集解釋快照數據,可像下面這樣執行 EXPLAIN 語句:

  EXPLAIN ALL FOR SNAPSHOT FOR SELECT * FROM DEPARTMENT

  最後,如果僅要為 SQL 語句 SELECT * FROM DEPARTMENT 收集全面解釋數據,像下面這樣執行 EXPLAIN 語句:

  EXPLAIN ALL FOR SELECT * FROM DEPARTMENT

  務必注意,EXPLAIN 語句未執行指定 SQL 語句,也未顯示所收集的解釋信息。要查看收集到的信息,必須使用其他解釋工具(下文中將介紹這樣的工具)。

  CURRENT EXPLAIN MODE 和 CURRENT EXPLAIN SNAPSHOT 特殊寄存器

  在您希望為單獨一條動態 SQL 語句收集解釋和/或解釋快照信息時,EXPLAIN SQL 語句非常有用,盡管如此,若有大量 SQL 語句需要分析,使用這種方法將極為耗時。要為多條動態 SQL 語句收集相同的信息,一種更好的方法就是在執行一組動態 SQL 語句之前,設置所提供的一種或兩種特殊解釋工具寄存器。隨後,語句准備好執行時,即可為所處理的各條語句收集解釋和/或解釋快照信息。(但在解釋和/或解釋快照信息收集完畢後,語句本身可能執行,也可能不會執行。)

  以這種方式使用的兩個解釋工具特殊寄存器就是 CURRENT EXPLAIN MODE 特殊寄存器和 CURRENT EXPLAIN SNAPSHOT 特殊寄存器。CURRENT EXPLAIN MODE 特殊寄存器是使用 SET CURRENT EXPLAIN MODE SQL 語句設置的,CURRENT EXPLAIN SNAPSHOT 特殊寄存器是使用 SET CURRENT EXPLAIN SNAPSHOT SQL 語句設置的。SET CURRENT EXPLAIN MODE SQL 語句的基本語法是:

  SET CURRENT EXPLAIN MODE <=>
  [NO |
  YES |
  EXPLAIN |
  REOPT |
  RECOMMEND INDEXES |
  EVALUATE INDEXES |
  RECOMMEND PARTITIONINGS |
  EVALUATE PARTITIONINGS]

  SET CURRENT EXPLAIN SNAPSHOT SQL 語句的基本語法是:

  SET CURRENT EXPLAIN SNAPSHOT <=> [YES | NO | EXPLAIN | REOPT]

  可想而知,若 CURRENT EXPLAIN MODE 和 CURRENT EXPLAIN SNAPSHOT 特殊寄存器均設置為 NO,解釋工具即被禁用,不會捕獲任何解釋數據。另一方面,若任一特殊寄存器被設置為 EXPLAIN,則相應的解釋工具即被激活,每當一條動態 SQL 語句准備好執行時,就會為其收集全面解釋信息或解釋快照數據(若兩個特殊寄存器均這樣設置,則同時收集這兩種信息)。但語句本身並不執行。若任一特殊寄存器被設置為 YES,行為與任一寄存器設置為 EXPLAIN 時基本相同,但存在一個重要的差異:為其收集解釋信息的動態 SQL 語句會在適當的解釋/解釋快照數據收集完備後立即執行。

  若 CURRENT EXPLAIN MODE 或 CURRENT EXPLAIN SNAPSHOT 特殊寄存器被設置為 REOPT,解釋工具將被激活,只要一條靜態或動態 SQL 語句在執行時的語句再優化過程中得到處理 —— 也就是說,在該語句中所用的主變量、特殊寄存器或參數標記的實際值可用時,解釋信息或解釋快照數據(若兩個特殊寄存器均按此設置,則同時收集這兩種信息)就會被捕獲。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved