什麼是解釋工具?
將一條 SQL 語句提交給 DB2 數據庫引擎進行處理時,DB2 Optimizer 會對其加以分析,以生成所謂的訪問計劃。各訪問計劃包括將用於執行該語句的策略的詳細信息(例如是否使用索引;若有排序方法,需要怎樣的排序方法等)。如果該 SQL 語句是在一個應用程序中編寫的,則訪問計劃生成於預編譯時(若使用了延時綁定,則在綁定時生成),另外還會生成一個可執行形式的訪問計劃,它作為稱為 “包” 的對象存儲在系統目錄中。但若語句是通過 Command Line Processor 提交的,或者語句是應用程序中的一條動態 SQL 語句(也就是說,這是一條在應用程序運行時構造的 SQL 語句),則訪問計劃將在該語句發出時生成,而所生成的可執行形式則臨時地存儲在內存中(位於全局包緩沖區中),而不是系統目錄。(若發出了一條 SQL 語句,而全局包緩沖區中已有其可執行形式的訪問計劃,則已有訪問計劃將被重用,不會再次調用 DB2 Optimizer。)
為什麼說這非常重要?原因在於,盡管可以使用數據庫系統監控器和健康監控器來獲取關於某些 SQL 操作執行的情況有多好(或多糟)的信息,但不能用這些監控器來分析單獨的 SQL 語句。要執行此類分析,您必須能夠捕獲並查看存儲於 SQL 語句的訪問計劃中的信息。而為了捕獲並查看訪問計劃信息,您必須使用 DB2 9 解釋工具。
使用解釋工具,您可以捕獲並查看為特定 SQL 語句選擇的訪問計劃的具體信息,還有可用於幫助確定編寫不良的語句或數據庫中弱點的性能信息。特別地,解釋數據將幫助您了解 DB2 Database Manager 如何為滿足查詢而訪問表和索引。解釋數據還可用於評估采取的任何性能調優行動。實際上,只要您更改了 DB2 Database Manager 的某些方面、SQL 語句或與語句交互的數據庫,都應收集並檢查解釋數據,弄清楚您的更改對性能產生了怎樣的效果(如果有效果的話)。
解釋表
必須首先創建一組特殊的表,即解釋表,之後才能捕獲解釋信息。表 4 列出了所用的各解釋表以及各表設計用於容納的信息。
表 4. 解釋表
表名 內容
EXPLAIN_ARGUMENT 包含所用各獨立操作符的獨特特征(如果存在的話)。
EXPLAIN_INSTANCE 包含所解釋的 SQL 語句的源的基本信息,還有關於進行解釋的環境的信息。(EXPLAIN_INSTANCE 表是所有解釋信息的主要控制表。其他解釋表中的各行數據顯式地鏈接到該表中的各行。)
EXPLAIN_OBJECT 包含關於為 SQL 語句生成的訪問計劃所需的數據對象的信息。
EXPLAIN_OperaTOR 包含 SQL 編譯器為滿足 SQL 語句而需的所有操作符。
EXPLAIN_PREDICATE 包含確定特定操作符應用哪些謂詞的相關信息。
EXPLAIN_STATEMENT 包含在得到不同級別的解釋信息時存在的 SQL 語句文本。用戶輸入的原始 SQL 語句存儲在該表中,另外還有 DB2 Optimizer 用於選擇滿足 SQL 語句的訪問計劃的版本。(後一種版本可能與原始版本的語句略有差異,因為 SQL Precompiler 可能已通過額外的謂詞重寫和/或增強了該語句。)
EXPLAIN_STREAM 包含關於各單獨操作符和數據對象之間存在的輸入輸出數據流的信息。(數據對象本身顯示於 EXPLAIN_OBJECT 表中,而數據流中涉及的操作符可在 EXPLAIN_OperaTOR 表中找到。)
典型情況下,解釋表用於數據庫開發之中,協助應用程序數據,但不會在應用程序代碼較為穩定的生產數據庫中。出於這方面的原因,它們不會隨系統目錄表一起作為數據庫創建過程的一部分而創建。相反,解釋表必須在要應用解釋工具的數據庫中手動創建,之後才能使用解釋工具。幸運的是,使用 Command Line Processor 創建解釋表的流程相當簡單,您只要建立一個到恰當數據庫的連接,並執行名為 EXPLAIN.DDL 的腳本即可,可在 DB2 9 軟件最初安裝的 “sqllib” 目錄下的 “misc” 子目錄中找到此腳本。(此文件頭部的注釋提供了執行方法信息。)