將一條 SQL 語句提交給 DB2 數(shù)據(jù)庫引擎進(jìn)行處理時,DB2 Optimizer 會對其加以分析,以生成所謂的訪問計劃。各訪問計劃包括將用于執(zhí)行該語句的策略的詳細(xì)信息(例如是否使用索引;若有排序方法,需要怎樣的排序方法等)。如果該 SQL 語句是在一個應(yīng)用程序中編寫的,則訪問計劃生成于預(yù)編譯時(若使用了延時綁定,則在綁定時生成),另外還會生成一個可執(zhí)行形式的訪問計劃,它作為稱為 “包” 的對象存儲在系統(tǒng)目錄中。但若語句是通過 Command Line Processor 提交的,或者語句是應(yīng)用程序中的一條動態(tài) SQL 語句(也就是說,這是一條在應(yīng)用程序運行時構(gòu)造的 SQL 語句),則訪問計劃將在該語句發(fā)出時生成,而所生成的可執(zhí)行形式則臨時地存儲在內(nèi)存中(位于全局包緩沖區(qū)中),而不是系統(tǒng)目錄。(若發(fā)出了一條 SQL 語句,而全局包緩沖區(qū)中已有其可執(zhí)行形式的訪問計劃,則已有訪問計劃將被重用,不會再次調(diào)用 DB2 Optimizer。)
為什么說這非常重要?原因在于,盡管可以使用數(shù)據(jù)庫系統(tǒng)監(jiān)控器和健康監(jiān)控器來獲取關(guān)于某些 SQL 操作執(zhí)行的情況有多好(或多糟)的信息,但不能用這些監(jiān)控器來分析單獨的 SQL 語句。要執(zhí)行此類分析,您必須能夠捕獲并查看存儲于 SQL 語句的訪問計劃中的信息。而為了捕獲并查看訪問計劃信息,您必須使用 DB2 9 解釋工具。
使用解釋工具,您可以捕獲并查看為特定 SQL 語句選擇的訪問計劃的具體信息,還有可用于幫助確定編寫不良的語句或數(shù)據(jù)庫中弱點的性能信息。特別地,解釋數(shù)據(jù)將幫助您了解 DB2 Database Manager 如何為滿足查詢而訪問表和索引。解釋數(shù)據(jù)還可用于評估采取的任何性能調(diào)優(yōu)行動。實際上,只要您更改了 DB2 Database Manager 的某些方面、SQL 語句或與語句交互的數(shù)據(jù)庫,都應(yīng)收集并檢查解釋數(shù)據(jù),弄清楚您的更改對性能產(chǎn)生了怎樣的效果(如果有效果的話)。
解釋表
必須首先創(chuàng)建一組特殊的表,即解釋表,之后才能捕獲解釋信息。表 4 列出了所用的各解釋表以及各表設(shè)計用于容納的信息。
表名 | 內(nèi)容 |
---|---|
EXPLAIN_ARGUMENT | 包含所用各獨立操作符的獨特特征(如果存在的話)。 |
EXPLAIN_INSTANCE | 包含所解釋的 SQL 語句的源的基本信息,還有關(guān)于進(jìn)行解釋的環(huán)境的信息。(EXPLAIN_INSTANCE 表是所有解釋信息的主要控制表。其他解釋表中的各行數(shù)據(jù)顯式地鏈接到該表中的各行。) |
EXPLAIN_OBJECT | 包含關(guān)于為 SQL 語句生成的訪問計劃所需的數(shù)據(jù)對象的信息。 |
EXPLAIN_OPERATOR | 包含 SQL 編譯器為滿足 SQL 語句而需的所有操作符。 |
EXPLAIN_PREDICATE | 包含確定特定操作符應(yīng)用哪些謂詞的相關(guān)信息。 |
EXPLAIN_STATEMENT | 包含在得到不同級別的解釋信息時存在的 SQL 語句文本。用戶輸入的原始 SQL 語句存儲在該表中,另外還有 DB2 Optimizer 用于選擇滿足 SQL 語句的訪問計劃的版本。(后一種版本可能與原始版本的語句略有差異,因為 SQL Precompiler 可能已通過額外的謂詞重寫和/或增強(qiáng)了該語句。) |
EXPLAIN_STREAM | 包含關(guān)于各單獨操作符和數(shù)據(jù)對象之間存在的輸入輸出數(shù)據(jù)流的信息。(數(shù)據(jù)對象本身顯示于 EXPLAIN_OBJECT 表中,而數(shù)據(jù)流中涉及的操作符可在 EXPLAIN_OPERATOR 表中找到。) |
收集解釋數(shù)據(jù)
解釋工具由多個單獨的工具組成,而并非所有的工具需要的都是相同類型的解釋數(shù)據(jù)。因此,可收集兩種不同類型的解釋數(shù)據(jù):
您或許已經(jīng)想到,有多種收集這兩種解釋數(shù)據(jù)的方法。收集解釋數(shù)據(jù)的可行方法包括:
EXPLAIN SQL 語句
為單獨一條動態(tài) SQL 語句收集全面解釋信息和解釋快照數(shù)據(jù)的方法之一就是執(zhí)行 EXPLAIN SQL 語句。該語句的基本語法是:
EXPLAIN [ALL | PLAN | PLAN SELECTION]
?。糉OR SNAPSHOT | WITH SNAPSHOT>
FOR [SQLStatement]
其中,SQLStatement 表示要為其收集解釋數(shù)據(jù)和/或解釋快照數(shù)據(jù)的 SQL 語句。(指定的語句必須是一條有效的 INSERT、UPDATE、DELETE、SELECT、SELECT INTO、VALUES 或 VALUES INTO SQL 語句。)
若在 EXPLAIN 語句中指定了 FOR SNAPSHOT 選項,則僅為指定動態(tài) SQL 語句收集解釋快照信息。另一方面,若指定的是 WITH SNAPSHOT 選項,則指定動態(tài) SQL 語句的全面解釋信息和解釋快照數(shù)據(jù)均會被收集。但若未使用任一選項,則僅收集全面解釋數(shù)據(jù),而不會產(chǎn)生任何解釋快照數(shù)據(jù)。
要為 SQL 語句 SELECT * FROM DEPARTMENT 收集全面解釋數(shù)據(jù)和解釋快照信息,可像下面這樣執(zhí)行 EXPLAIN 語句:
EXPLAIN ALL WITH SNAPSHOT FOR SELECT * FROM DEPARTMENT
另一方面,如果希望僅為這條 SQL 語句收集解釋快照數(shù)據(jù),可像下面這樣執(zhí)行 EXPLAIN 語句:
EXPLAIN ALL FOR SNAPSHOT FOR SELECT * FROM DEPARTMENT
最后,如果僅要為 SQL 語句 SELECT * FROM DEPARTMENT 收集全面解釋數(shù)據(jù),像下面這樣執(zhí)行 EXPLAIN 語句:
EXPLAIN ALL FOR SELECT * FROM DEPARTMENT
務(wù)必注意,EXPLAIN 語句未執(zhí)行指定 SQL 語句,也未顯示所收集的解釋信息。要查看收集到的信息,必須使用其他解釋工具(下文中將介紹這樣的工具)。
CURRENT EXPLAIN MODE 和 CURRENT EXPLAIN SNAPSHOT 特殊寄存器
在您希望為單獨一條動態(tài) SQL 語句收集解釋和/或解釋快照信息時,EXPLAIN SQL 語句非常有用,盡管如此,若有大量 SQL 語句需要分析,使用這種方法將極為耗時。要為多條動態(tài) SQL 語句收集相同的信息,一種更好的方法就是在執(zhí)行一組動態(tài) SQL 語句之前,設(shè)置所提供的一種或兩種特殊解釋工具寄存器。隨后,語句準(zhǔn)備好執(zhí)行時,即可為所處理的各條語句收集解釋和/或解釋快照信息。(但在解釋和/或解釋快照信息收集完畢后,語句本身可能執(zhí)行,也可能不會執(zhí)行。)
以這種方式使用的兩個解釋工具特殊寄存器就是 CURRENT EXPLAIN MODE 特殊寄存器和 CURRENT EXPLAIN SNAPSHOT 特殊寄存器。CURRENT EXPLAIN MODE 特殊寄存器是使用 SET CURRENT EXPLAIN MODE SQL 語句設(shè)置的,CURRENT EXPLAIN SNAPSHOT 特殊寄存器是使用 SET CURRENT EXPLAIN SNAPSHOT SQL 語句設(shè)置的。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 特殊寄存器均設(shè)置為 NO,解釋工具即被禁用,不會捕獲任何解釋數(shù)據(jù)。另一方面,若任一特殊寄存器被設(shè)置為 EXPLAIN,則相應(yīng)的解釋工具即被激活,每當(dāng)一條動態(tài) SQL 語句準(zhǔn)備好執(zhí)行時,就會為其收集全面解釋信息或解釋快照數(shù)據(jù)(若兩個特殊寄存器均這樣設(shè)置,則同時收集這兩種信息)。但語句本身并不執(zhí)行。若任一特殊寄存器被設(shè)置為 YES,行為與任一寄存器設(shè)置為 EXPLAIN 時基本相同,但存在一個重要的差異:為其收集解釋信息的動態(tài) SQL 語句會在適當(dāng)?shù)慕忉?解釋快照數(shù)據(jù)收集完備后立即執(zhí)行。
若 CURRENT EXPLAIN MODE 或 CURRENT EXPLAIN SNAPSHOT 特殊寄存器被設(shè)置為 REOPT,解釋工具將被激活,只要一條靜態(tài)或動態(tài) SQL 語句在執(zhí)行時的語句再優(yōu)化過程中得到處理 —— 也就是說,在該語句中所用的主變量、特殊寄存器或參數(shù)標(biāo)記的實際值可用時,解釋信息或解釋快照數(shù)據(jù)(若兩個特殊寄存器均按此設(shè)置,則同時收集這兩種信息)就會被捕獲。
EXPLAIN 和 EXPLSNAP 預(yù)編譯/綁定選項
至此,您已經(jīng)看到了為動態(tài) SQL 語句收集全面解釋信息和解釋快照數(shù)據(jù)的一些方法。但在很多時候,數(shù)據(jù)庫應(yīng)用程序由靜態(tài) SQL 語句構(gòu)成,這些語句同樣需要分析。那么如何使用解釋工具來分析在嵌入式 SQL 應(yīng)用程序中編寫的靜態(tài) SQL 語句呢?要為在嵌入式 SQL 應(yīng)用程序中編寫的靜態(tài)和/或動態(tài) SQL 語句收集全面解釋信息和/或解釋快照數(shù)據(jù),可以依靠 EXPLAIN 和 EXPLSNAP 預(yù)編譯/綁定選項。
如您所料,EXPLAIN 預(yù)編譯/綁定選項用于控制是否為在嵌入式 SQL 應(yīng)用程序中編寫的靜態(tài)和/或動態(tài) SQL 語句收集全面解釋數(shù)據(jù)。類似地,EXPLSNAP 預(yù)編譯/綁定選項用于控制是否為在嵌入式 SQL 應(yīng)用程序中編寫的靜態(tài)和/或動態(tài) SQL 語句收集解釋快照數(shù)據(jù)。可在用于預(yù)編譯包含嵌入式 SQL 語句的源代碼文件的 PRECOMPILE 命令中指定這兩個選項或其中之一。若使用了延遲綁定,那么可以在將應(yīng)用程序的綁定文件綁定到數(shù)據(jù)庫的 BIND 命令中提供這些選項。
可為 EXPLAIN 選項和 EXPLSNAP 選項指派的值包括 NO、YES、ALL 或 REOPT。如果兩個選項均被指派以 NO 值(例如,EXPLAIN NO EXPLSNAP NO),解釋工具將被禁用,不捕獲任何解釋數(shù)據(jù)。另一方面,若任一選項被指派以 YES 值,解釋工具將被激活,為應(yīng)用程序中發(fā)現(xiàn)的每一條靜態(tài) SQL 語句收集全面解釋信息或解釋快照數(shù)據(jù)(若兩個選項均按此設(shè)置,則同時收集這兩種信息)。若任一選項被指派以 ALL 值,解釋工具將被激活,并且為找到每一條靜態(tài) SQL 語句和每一條動態(tài) SQL 語句收集全面解釋信息或解釋快照數(shù)據(jù)(若兩個選項均按此設(shè)置,則同時收集這兩種信息),即便是 CURRENT EXPLAIN MODE 和/或 CURRENT EXPLAIN SNAPSHOT 特殊寄存器已設(shè)置為 NO。
若 EXPLAIN 或 EXPLSNAP 選項被指派以 REOPT 值,則各可再優(yōu)化的遞增綁定 SQL 語句的全面解釋信息或解釋快照數(shù)據(jù)(若兩個選項均按此設(shè)置,則同時收集這兩種信息)將在運行時放入解釋表,即便是 CURRENT EXPLAIN MODE 和/或 CURRENT EXPLAIN SNAPSHOT 特殊寄存器已設(shè)置為 NO。
評估解釋數(shù)據(jù)
至此為止,您一直將精力集中在收集全面解釋數(shù)據(jù)和解釋快照數(shù)據(jù)的不同方法上。但收集完數(shù)據(jù)后,如何查看這些數(shù)據(jù)?為了回答這個問題,您需要先看看專門設(shè)計用于以一種有意義的格式呈現(xiàn)解釋信息的解釋工具。其中包括:
之前您已經(jīng)了解到,在包含嵌入式 SQL 語句的源代碼文件綁定到數(shù)據(jù)庫時(無論是作為預(yù)編譯流程的一部分還是在延遲綁定過程中),DB2 Optimizer 將分析遇到的每一條靜態(tài) SQL 語句,并生成一個相應(yīng)的訪問計劃,此訪問計劃隨后以包的形式存儲在數(shù)據(jù)庫中。給定數(shù)據(jù)庫名稱、包名稱、包創(chuàng)建者 ID、部分號(若指定了部分號 0,則處理包的所有部分),db2expln 工具即可為存儲在數(shù)據(jù)庫系統(tǒng)目錄中的任何包解釋并說明其訪問計劃。由于 db2expln 工具直接處理包而非全面解釋數(shù)據(jù)或解釋快照數(shù)據(jù),因而通常用來獲取那些已選定用于未捕獲其解釋數(shù)據(jù)的包的訪問計劃的相關(guān)信息。但由于 db2expln 工具僅可訪問已存儲在包中的信息,因而只能說明所選的最終訪問計劃的實現(xiàn),不能提供特定 SQL 語句優(yōu)化方式的信息。
若使用額外的輸入?yún)?shù),db2expln 工具還可用于解釋動態(tài) SQL 語句(不包含參數(shù)標(biāo)記的動態(tài) SQL 語句)。
db2exfmt
與 db2expln 工具不同,db2exfmt 工具設(shè)計用于直接處理已收集并存儲在解釋表中的全面解釋數(shù)據(jù)或解釋快照數(shù)據(jù)。給定數(shù)據(jù)庫名和其他限定信息,db2exfmt 工具將在解釋表中查詢信息、格式化結(jié)果,并生成一份基于文本的報告,此報告可直接顯示在終端上或?qū)懭?ASCII 文件。
Visual Explain
Visual Explain 是一種 GUI 工具,它為數(shù)據(jù)庫管理員和應(yīng)用程序開發(fā)人員提供了查看為特定 SQL 語句選擇的訪問計劃的圖形化表示的能力。Visual Explain 允許您完成以下任務(wù):
但 Visual Explain 只能用于查看解釋快照數(shù)據(jù),要查看已收集并寫入了解釋表的全面解釋數(shù)據(jù),則必須使用 db2exfmt 工具。
如您所見,可用于顯示全面解釋數(shù)據(jù)和解釋快照的不同工具有著很大的差異,無論是在復(fù)雜性方面還是在功能方面。表 5 總結(jié)了幾種可用工具,并強(qiáng)調(diào)了各工具的特征。要使解釋工具發(fā)揮出最好的效果,您應(yīng)在選擇工具時考慮您的環(huán)境和需求。
所需特征 | Visual Explain | db2exfmt | db2expln |
---|---|---|---|
用戶界面 | 圖形化 | 基于文本 | 基于文本 |
“快速但粗略的” 靜態(tài) SQL 分析 | 否 | 否 | 是 |
靜態(tài) SQL 支持 | 是 | 是 | 是 |
動態(tài) SQL 支持 | 是 | 是 | 是 |
CLI 應(yīng)用程序支持 | 是 | 是 | 否 |
詳細(xì)的 DB2 Optimizer 信息可用 | 是 | 是 | 否 |
適于分析多條 SQL 語句 | 否 | 是 | 是 |