你怎麼知道什麼地方是你的調整努力的焦點呢?還是做個快照吧。當你回顧我最近的專欄時,我總推薦DBA們在動手處理做性能調整當中一定要制定明確詳細的計劃;在頭腦裡一定要有個現實的可測量的目標。否則,就會成為一個無意義的練習。在改進數據庫性能的時候,你必須首先清楚哪裡會是性能的瓶頸並且有相應的對策。這就是DB2 UDB系列產品中性能監控工具的用武之地。從這個專欄開始我將為你講述一系列如何使用這些工具來確定你應該關注調整效果地地方,並且發現是否調整有效的解決問題。 在這一部分,我將介紹可使用的工具同時將詳細說明其中之一(快照監視器)以及與它相關的開關參數。在下個專欄中我將會介紹事件監視器。DB2 數據庫系統監視器雖然它的名字聽起來有些像是一個單獨的工具,其實數據庫系統監視器實際上是由兩種不同類型的監視工具組成,他們負責捕獲和返回系統信息:快照監視器和一個或者更多個事件監視器。快照監視器會讓你獲得在一個指定的時間點上的狀態映像。 事件顯示器在指定時間發生時獲取監視器數據並且將它們記入日志文件。這兩種類型所收集的信息都存儲於監視器要素中(有時被認為是數據要素);每個要素被設計成存儲指定類型的信息。 下面列出的是可利用的監視器要素名單:計數器 用來保留活動或者事件發生次數的合計值(例如,對於一個數據庫的已經執行的SQL語句的的總數)。計數器數值得增長貫穿監視器的生命周期;而在許多情況下它有可能會重置計數器監視器要素。 Gauges 表明一個項目的當前值(例如,當前連接到數據庫的應用程序的數量。) 與計數器值不同於的是,Gauges的值可以變高或者變低;他們在任一被測量的點實時的值通常取決於數據庫活動的級別。 Watermarks 表明一個指標在監視開始以後所能達到的最大值或最小值(例如,更新操作所影響的最大行數)。信息要素 提供所有監視活動執行的細節信息(例如,緩沖池名稱、數據庫名稱和別名、詳細路徑等等)。時間戳 表明一個活動或者事件發生的日期和時間(例如,第一次連接數據庫建立的日期和時間)。時間戳被看成是從1970 年1月1 日開始消逝的秒和微妙的數量的值。時間要素 記錄時間被花費於執行一個活動或事件的成本(例如:進行排序操作時間花費)。時間要素的值會以從活動或事件開始所流逝的秒和微秒的數量形式來表現。一些時間要素可以被重置。數據庫系統監示器使用這些要素的一些組合來獲取監視數據並且為每一個要素的數據存儲提供了幾種選擇。快照和事件監視器均可以給予你存放所有被收集的數據在文件或數據庫表的選擇權,通過屏幕察看或者使用一個定制的程序去處理它。數據庫系統監視器通過一些使用自描述的數據流來將監視數據返回到客戶端應用程序。使用快照監視應用程序,你可以調用適當的API 獲得快照信息然後處理返回的數據流。使用事件監視應用程序,你事先准備從文件或命名管道來接收數據,激活相應的事件監視器,然後按照剛才接收數據那樣處理數據流。快照監視器向我提到的一樣,快照顯示器被設計用於收集那些在它控制下的某一特定時間點的DB2 UDB實例和一些數據庫的狀態的信息。快照對於確定一個數據庫系統的狀態是非常有用的。采用固定的時間間隔,他們能夠提供出一寫讓你觀察取向和辨認潛在的問題范圍的信息。快照監視通過在命令行處理器(CLP)中執行GET SNAPSHOT命令或者通過從應用程序中調用db2GetSnapshot()和db2gGetSnapshot()(如果使用除C或者C++之外的高級編程語言)API。 開關雖然快照監視器信息有助於辨認問題范圍,收集數據經常會引起額外的處理負擔。例如,為了計算執行SQL語句總的時間花費,DB2 數據庫管理器必須在SQL語句執行前後去調用操作系統級命令用來獲得時間戳信息。 這些系統級調用的成本可能是昂貴的。其它副作用是增加內存的使用:快照監視器數據是收集和存放在內存中而不是在某些特定的表或者外部文件中。為了有助於減少收集快照監視器數據的過載需求的數量,DB2推薦使用控制被收集新的的數量和類型的快照監視器開關。像其他基本開關一樣,每個快照監視器都有開和關兩種狀態的設置。當快照監視器開關打開的時候,在這個開關控制之下的一些監視器要素的信息被收集起來。相反也是。(注意:一定數量的監視信息是不受這些開關的控制因此這些信息不管那些開關被設置成什麼狀態總會被收集的。)表1 列出了可利用的快照監視器開關參數並且描述了當這個開關被打開始後可以收集信息的類型。除了TIMESTAMP缺省值是打開的以外,所有可利用的快照顯示器缺省都是關閉的。
表1 。 快照監視器開關參數
查看開關設置在某種程度上,由於快照監視器開關控制著當一個快照被打開時縮搜集到的信息的類型和數量,因此你應該在開始你的監視進程之前搞清楚哪些開關是打開的而那些是關閉的。獲得這些信息最簡單的方法就是通過在CLP中執行GET MONITOR SWITCHES命令。在多分區數據庫環境下它的基本語法是:GET MONITOR SWITCHES < AT DBPARTITIONNUM [PartitionNum] > PartitionNum 參數用來說明你需要獲取快照監視器開關參數狀態的數據庫分區。注: 尖括號(<>)顯示的參數是可選的參量,而在方括號([ ])裡面的參數是必須的。獲取和顯示一個單獨分區數據庫的快照監視器開關的狀況,可以執行GET MONITOR SWITCHES命令。假定均使用缺省的設置,結果如清單1所示.
清單1 。 運行GET MONITOR SWITCHES命令的結果。
從上面可以看到,TIMESTAMP這個快照監視器開關的狀態是ON而其他的都是OFF。在這個開關狀態後面顯示的是這個開關打開的精確日期和時間。改變開關參數 在你知道了每一個可用的快照監視器開關的當前狀態以後,你就想在你開始監測之前去改變其中的一個或者多個開關的設置。你可以通過改變相對應的數據庫管理器配置參數(參見表 1)或者調用應用程序級db2MonitorSwitches() API函數或執行UPDATE MONITOR SWITCHES命令在實例級修改快照監視器開關的設置(該設置在實例重啟後依然有效) 這個命令的基本語法:
UPDATE MONITOR SWITCHES USING [[SwitchID] ON | OFF ,...]
SwitchID 指明一個或者多個需要改變狀態的快照監視器開關。(該參數可以是以下其中的一部分或者是全部:BUFFERPOOL, LOCK, SORT, STATEMENT, TABLE, TIMESTAMP, UOW。)要將LOCK和Sort快照監視器開關參數狀態設置為ON(實例級別),可以執行UPDATE MONITOR SWITCHES USING LOCK ON SORT ON命令。獲取數據 當數據庫被激活或者與數據庫的連接被建立的時候,快照顯示器自動地開始收集監視器數據。但是,在你能夠觀看被收集的數據之前,你必須選取一個快照。(快照看起來就像是當時那個時間點上的監視要素的映像。)你可以通過調用db2GetSnapshot() API或者執行GET SNAPSHOT命令來得到快照。清單2指明了這個命令的基本語法,DatabaseAlias 用來說明需要手機快照監視器信息的數據庫別名。
清單2 。 GET SNAPSHOT命令的句法。
僅僅想得到在工資數據庫中被應用程序保持的鎖定的快照信息,可以執行 GET SNAPSHOT FOR LOCKS ON PAYROLL命令。該命令輸出的工作產品類似於清單3中的結果 (需要注意的是這只是一個非常簡單的例子。真正監視器返回的監視數據通常要比這個大得多)
清單3 。 對一個數據庫使用GET SNAPSHOT FOR LOCKS命令得到的快照輸出的樣本。
正如你所看到的,使用GET SNAPSHOT命令(或者db2GetSnapshot() API)可以使用於獲取幾種不同的類型監視數據,它們包括:DB2 數據庫管理器實例數據 同一實例控制下所有活動數據庫的數據庫數據 應用程序數據 緩沖池活動數據 表空間數據 表數據 鎖數據(關於所有保持鎖定的鎖的信息) 動態SQL 數據(在SQL語句緩存中的當時關於SQL語句的信息) 。 需要注意的是,在快照監視器開關之間有一種直接交互作用可利用並且當某一個快照打開的情況下會收集到不同類型的監視數據。 如果在一個細節描述的快照顯示器開關關閉的情況下選取與它相關聯的監視元素的快照,那麼監視數據不會返回任何信息。(在早先例子中,被列為“未收集”信息的原因就是LOCK的快照監視器開關被設置為關閉狀態了。如果在快照打開的狀態下沒有獲取到鎖定信息,那麼“保持的鎖定”的值就會為0並且鎖定信息列表就不會被提供出來。) 使用SQL來捕獲數據 在DB2 UDB的早些版本中,獲取快照監視器數據唯一的方式就是去執行GET SNAPSHOT命令或者從應用程序中調用它對應的API函數。而在DB2 UDB 8.1中,你還可以通過引用20個可用的快照監視器表函數中的一個來構造查詢去收集快照數據。表2列出了這些函數以及指明他們所能獲取的具體快照信息。
表2. 快照監視器的表函數
用下面的語法將會創建一個引用非數據庫管理器級表函數的查詢:
SELECT * FROM TABLE ( [FunctionName]('[DBName]',[PartitionNum]) AS [CorrelationName]
在這裡FunctionName 用來說明所使用得快照監視器的表函數; DBName 指明需要從那個數據庫的快照監視器中搜集數據; PartitionNum 說明需要從那個數據庫分區的快照監視器中搜集數據; CorrelationName 則是查詢產生的結果數據集的名稱。 構造一個引用數據庫管理器級的快照監視器表函數查詢的語法也是一樣的。不同的是:DBName 參數不使用。如果你想要獲取一個分區數據庫環境裡當前分區的快照監視器數據,你可以將PartitionNum參數的值設置為-1;如果你希望獲取所有分區的快照監視器數據,可以把它設置為-2。同樣,如果你想獲取當前連接數據庫的快照信息,你可以把DBName參數設定成一個空值,也可以使用一對空的單引號或者用一個CAST操作——例如:CAST (NULL AS CHAR)如果你想要通過使用快照監視器的表函數SNAPSHOT_LOCk來抓取包含被應用程序相關聯的當前連接的數據庫的鎖定數據的快照信息,可以執行下面的語句:
SELECT * FROM TABLE (SNAPSHOT_LOCK (CAST (NULL AS CHAR), -1) AS LOCK_INFO
如果我們使用PAYROLL數據庫(先前的例子) 作為當前的被連接的數據庫,那麼執行GET SNAPSHOT FOR LOCKS ON PAYROLL命令返回的信息將會與先前的那個非常的相似(表3)。重置計數器 另一個監視器要素被稱為計數器,它保存一個運行期間的具體活動或事件發生的次數的數量的累積。 典型的計數開始於快照監視器開關打開或與數據庫的連接被建立(如果實例級別的監視器被使用,計數開始於應用程序第一次建立與該實例控制下的數據庫連接的時候) 。計數一旦開始,他將一直繼續到適當的快照顯示器開關被關閉或直到所有數據庫連接被終止。 但是, 但有時候也可以在你沒有改變一個或更多快照顯示器開關狀態和沒有終止和重建所有當前活動數據庫的連接情況下可以去重置所有計數器為零。在這種情況下,所有的監視器的計數器可以通過執行RESET MONITOR命令去將他們歸零。這個命令的基本語法是:RESET MONITOR ALL 或者 RESET MONITOR FOR [DATABASE | DB] [DatabaseAlias] [DatabaseAlias]指明名你想要將快照監視器的計數器歸零的數據庫別名。如果你想要重置一個實例控制下的所有數據庫快照監視器的計數器,可以切換到這個實例下執行RESET MONITOR ALL命令。另一方面,如果你只是想要把與PAYROLL數據庫相關聯的快照監視器的計數器重置為0的話,那麼你可以這麼做——執行RESET MONITOR FOR DATABASE PAYROLL命令。記住,你不能使用RESET MONITOR命令來有選擇性地對快照監視器開關所控制的特殊的監視器組重置他們的計數器。 反而,你必須將適當的快照監視器開關關閉和然後再打開或者終止並且重建數據庫連接。 接下來快照監視器只是DB2 UDB可利用的監視工具當中的一個,並且在有些時候快照並不是很好的選擇。 在下個章節中, 我將介紹入何時用事件監視器去收集那些快照監視器所沒有辦法處理的事件或者活動的監視數據。