在 Application Summary 視圖中選擇適當的應用程序(在本例中是 db2bp.exe)。 圖 2. Application Summary
在 Application Details 視圖中選擇 SQL Activity。 圖 3. Application Details 方法 圖 3中給出的 SQL Activity 界面顯示了有關應用程序執行的語句的信息,其中包括任務單元(UOW)、光標、讀取的行、選擇的行等等。要判定我們是否需要索引,需要查看讀取的行與選擇的行的比率。 12345678910下一頁 讀取的行與選擇的行 讀取的行與選擇的行的比率說明了為了要找到目標記錄行,一共要讀取多少行數據。假如讀取的行數與選擇的行數的比值大于推薦值,那么我們就應該對查詢進行分析,并對可能的索引進行檢查。 計算:(讀取的行數) / (選擇的行數) 理想值:對于 OLTP 來說,該值為 2 到 3 結論 DB2 讀取了 99,145 行,但只選擇了 2,000 行。這就是說,它讀取了整個表的內容,卻只選擇了 2,000 行。因此,創建索引可能會提高性能。
重新回顧排序性能 DB2 PE 步驟 在 System Overview 面板中選擇 Application Summary。 在 Application Summary 視圖中選擇適當的應用程序(在本例中是 db2bp.exe)。 在 Application DetailsSelect 視圖中選擇 Sort,如 圖 4 所示。 圖 4. Application Details
方法 Sort 界面中顯示了有關排序操作的具體信息,其中包括所有排序、所有排序時間、排序溢出、hash 連接等。 排序溢出 這個數字說明了排序時用光排序堆而需要磁盤空間臨時進行存儲的行數。 在數據庫或應用程序級,使用這個元素可以計算溢出到磁盤上的排序的百分比。假如這個百分比很高,那么您可能希望通過增加排序堆來調整數據庫的配置。在語句級上,可以使用該元素判定需要大型排序的語句。這些語句可以從減少所需排序數量的其他調優中獲益。在出現排序溢出情況時,可能導致其他開銷,因為假如需要將數據寫入磁盤,那么排序需要一個合并階段,這可能需要更多的 I/O。該元素為一條語句、一個應用程序或訪問一個數據庫的所有應用程序都提供了有用的信息。實質上,要排序的數據都會從緩沖池溢出到 TEMPSPACE 表空間中。 上一頁12345678910下一頁 計算:(排序溢出行數) / (總排序行數) 理想值:對于非 DSS 型的任務來說,該值為零或接近零的值 結論 在出現排序溢出的情況時,可能會造成額外的開銷,因為假如要將數據寫入磁盤,那么排序就會需要一個合并階段,這可能需要更多的 I/O。為了避免出現這種溢出,可以增加排序堆的大小,并對查詢進行分析,以確定查詢是否需要使用索引。 檢查對表進行重構的需要 DB2 PE 步驟 在 System Overview 面板中選擇 Statistic Details。 圖 5. System Overview
在 Statistic Details 視圖中選擇 Tables,并選中 Receive table information。 圖 6. Statistic Details
方法 Statistic Details 中的 Table 視圖給出了有關表的具體信息,其中包括表名、數據庫名、寫入的行數、讀取的行數、溢出的行數、表的文件 id、表的類型、頁面重構等。 訪問溢出的行 這個數字說明了對該表中溢出行進行存取(讀和寫)的數目。 溢出行說明了數據中的碎片情況。假如這個數字很高,那么您可以通過使用 REORG 工具對表進行重構,從而提高表的性能,這會清理數據中的碎片。當一行數據被更新并且不再適合原來寫入的數據頁時,就會出現行溢出的情況。這通常是對 VARCHAR 列進行更新的結果,或者是執行 ALTER TABLE 語句的結果。 頁面重構: 這個數字說明了需要對一個表進行重構的頁數。 對太多頁進行重構可能會導致性能比優化插入方式的性能還要低。您可以使用 REORG TABLE 工具對表進行重構,從而消除數據碎片。您還可以使用 ALTER TABLE 語句的 APPEND 參數來說明插入某個表的所有數據都要附加到該表的末尾,以避免頁面重構問題。在對行進行更新導致該行的長度增加的情況下,雖然頁面可能有足夠的空間來容納新行,但是為了整理這段空間的碎片,可能需要對頁面進行重構。或者,假如頁面中沒有足夠的空間來容納更大的行,就會創建一條溢出記錄。您可以使用固定長度而不是可變長度的列來避免這兩種情況。 上一頁12345678910下一頁 結論 對太多頁進行重構可能會導致性能比優化插入方式的性能還要低。假如您有大量的頁面需要重構,可以使用 REORG TABLE 工具對表進行重構,并消除數據碎片。 調優 DB2 代理的個數 現在,您的目標是確保有足夠多的 DB2 代理來處理工作負載。 DB2 PE 步驟 在 System Overview 面板中選擇 Statistic Details。 在 Statistic Details 視圖中選擇 Instance Information,如 圖 7 所示。 圖 7. Statistic Details
方法 Statistic Details 中的 Instance Information 視圖給出了有關當前實例的具體信息,其中包括實例名、當前的連接數、已注冊的代理數、已注冊最大代理數、等待令牌的代理數、從緩沖池中分配的代理數、已竊取的代理數等。 已注冊的代理 該值說明了在正被監視的數據庫治理實例中注冊的代理(協調代理和子代理)個數。您可以使用這個元素來幫助評價最大代理配置參數的設置。 已注冊的最大代理 該值是從數據庫啟動以來,曾經同時在數據庫治理程序中注冊的代理(協調代理和子代理)的最大個數。您可以使用這個元素來幫助評價最大代理配置參數的設置。 等待令牌的代理 該值是等待令牌以便在數據庫治理程序中執行事務的代理的個數。您可以使用這個元素來幫助評價最大代理配置參數的設置。 已竊取的代理: 該值是從應用程序中竊取的代理的次數。當一個與應用程序關聯的空閑代理被重新分配給一個普通的應用程序執行任務時,就會出現代理竊取。可以用該元素來評價應用程序對系統的負載情況。 上一頁12345678910下一頁 結論 假如您發現有"等待令牌的代理" 或 "已竊取的代理",就增大數據庫治理程序中可用代理的個數(MAXAGENTS 和/或 MAX_COORDAGENTS)。 解決鎖沖突的問題 DB2 PE 步驟 在 System Overview 面板中選擇 Locking Conflicts。 圖 8. System Overview
在 Locking Conflicts 視圖中選擇適當的鎖沖突。 圖 9. Locking Conflicts
要分析等待某個鎖的應用程序,請選擇 Waiter(等待鎖的)應用程序。 圖 10. 鎖沖突的應用程序 —— waiter 應用程序
在 Application Details 視圖中選擇 SQL Statement and Package。 圖 11. waiter 應用程序的 SQL Statement and Package
在 Application Details 視圖中選擇 Locks。 圖 12. waiter 應用程序的 Locks
為了對持有鎖的應用程序進行分析,請選擇一個 Holder(持有鎖的) 應用程序。 圖 13. 鎖沖突中的應用程序 —— holder 應用程序
在 Application Details 視圖中選擇 SQL Statement and Package。 上一頁12345678910下一頁 圖 14. holder 應用程序的 SQL Statement and Package
在 Application Details 視圖中選擇 Locks。 圖 15. holder 應用程序的 Locks
要找到哪個用戶正在運行 holder 應用程序,可以選擇 Application Details 視圖中的 Identification。 圖 16. holder 應用程序的 User Identification
方法 在 System Overview 面板中選擇 Applications in Lock Conflicts,顯示鎖沖突所設計的所有應用程序,當您選擇 Locking Conflicts時,這些應用程序都與一個非凡的資源相關聯。 Application in Lock Conflicts 面板顯示了 holder 和 waiter 應用程序,其中包括應用程序的狀態、鎖的模式、鎖等待時間等。 Application Details 視圖中的 SQL Statement and Package 展示了加鎖的應用程序的 SQL 語句。 Application Details 視圖中的 Locks 顯示了具體的加鎖信息,例如應用程序所持有的鎖、檢測到的死鎖、鎖升級、等待鎖的代理等。 Application Details 視圖中的 Identifcation 顯示了有關正在運行該應用程序的用戶的具體信息。 應用程序所持有的鎖: 這個數字說明當前的應用程序持有多少個鎖。 假如監視信息是在數據庫級上進行的,那么該值就是數據庫中所有應用程序所持有的鎖的總數。假如監視信息是應用程序級的,那么該值就是這個應用程序的所有代理目前持有的鎖的總數。 上一頁12345678910下一頁 從連接以來等待的鎖: 這個數字是應用程序或連接已經等待鎖的次數。 在數據庫級上,該值是應用程序在這個數據庫上等待鎖的次數。而在應用程序連接級上,該值是在某個連接請求一個鎖但由于另外一個連接正持有該數據的鎖而必須等待的次數。可以使用該元素計算在數據庫級上等待一個鎖的平均等待時間。這種計算可以在數據庫級或應用程序連接級上進行。假如鎖的平均等待時間很長,那么您應該查看一下持有很多鎖的應用程序;或者假如是這種情況導致等待時間過長,就對該鎖進行升級,從而重點對應用程序進行調優,以改進并發性。假如升級是導致鎖平均等待時間很長的原因,那么可能是 locklist 或 maxlocks 這兩個配置參數值中的一個太小了,也可能這兩個參數值都太小了。 鎖升級 這個數字說明了某個鎖作為鎖升級的一部分被升級的次數。升級的范圍可以從(一個表中的)許多行鎖到單獨某個表鎖。 可以使用這個元素更好地理解死鎖的原因。假如您曾經碰到過有關應用程序執行鎖升級而導致死鎖的情況,那么就可能希望增加鎖內存的數量(locklist)或修改一個應用程序可以請求某個鎖的百分比(maxlocks)。 檢測到的死鎖 該值是已經出現死鎖的總數。 可以用該元素來判定應用程序正出現爭用問題。這些問題可能是由于以下情形引起的: 數據庫中正在進行鎖升級。 應用程序可能在系統生成足夠多的行鎖時顯式地對表進行鎖定。 應用程序可能在綁定時使用了不恰當的隔離級別。 為了可以重復讀而鎖定目錄表。 應用程序正在對不同的訂單使用相同的鎖,從而導致死鎖。 您可以通過判定死鎖是在哪個應用程序(或應用程序進程)上產生的來解決問題。然后可以修改應用程序,使其能夠更好地并行執行。然而,有些應用程序可能不能并行運行。您可以使用連接的時間戳監視元素,判定死鎖的嚴重性。例如,在 5 分鐘之內出現 10 次死鎖就比在 5 小時內出現 10 次死鎖嚴重得多。對上面列出的這些相關元素的描述還提供了其他一些調優建議。 上一頁12345678910下一頁 等待鎖的代理: 該值說明了等待某個鎖的代理個數。 這個元素是應用程序等待某些鎖的百分比的一個指示器。假如這個數字很大,那么您的應用程序可能存在并行問題,您應該對現在持有鎖或者長期持有互斥鎖的應用程序進行分析。 結論: 檢查 waiter 和 holder 應用程序的 SQL 語句,確定諸如應用程序中頻繁進行提交操作而導致釋放鎖或檢查應用程序使用的隔離級別之類的操作。當執行很多更新時,在更新之前,要在整個事務的持續時間內鎖定整個表。雖然這樣可以只使用一個鎖,同時還可以防止其他鎖妨礙更新操作,但是這樣做會減少數據對于其他用戶的并發能力。 經常使用 cache 包中的 SQL 語句進行檢查 DB2 PE 步驟 在 System Overview 面板中選擇 Statistic Details。 在 Statistic Details 視圖中選擇 Dynamic SQL Statements。 圖 17. Dynamic SQL Statements
下拉滾動條,查看語句的具體資料。 圖 18. 語句的具體資料
方法 Statistic Details 中的 Dynamic SQL Statements 視圖給出了有關 SQL 語句的具體信息,其中包括訪問的數據庫、執行次數、已經過去的執行時間、最差和最佳的預備時間、排序,以及在選中 Receive statement cache information時每條語句占用的 CPU 時間等。 通過點擊如 圖 17所示的標題中的 Executions列,可以按照執行次數對 SQL 語句進行降序排列,這樣就可以看到執行最頻繁的 SQL 語句。 上一頁12345678910下一頁 執行次數 該值是一條 SQL 語句已經被執行的次數。您可以使用該元素來判定系統中執行最頻繁的 SQL 語句。 每條語句占用的 CPU 時間 這個數字說明了一條 SQL 語句占用的所有 CPU 時間。可以將該元素與“已經過去的執行時間”和“每條用戶語句占用的 CPU 時間”一起使用,來評價語句的最大花費。 最佳預備時間: 該值是預備一條特定的 SQL 語句所需要的最短時間。可以用該值來判定編譯耗時的 SQL 語句。 最差預備時間: 該值是預備一條特定的 SQL 語句所需要的最長時間。可以用該值來判定編譯耗時的 SQL 語句。 結論 這個執行監視元素可以您幫助判定系統中執行最頻繁的 SQL 語句。在本例中,某個查詢運行了 500 次,并且進行了 500 次排序。這是進行查詢優化的很好的一個選擇,可以檢查排序值,并驗證是否需要創建新的索引。 分析緩沖池 DB2 PE 步驟 在 System Overview 面板中選擇 Buffer Pool Analysis。 圖 19. System Overview
在 Buffer Analysis 中選擇 File-> Generate new report。 圖 20. 緩沖池分析
圖 21顯示了緩沖池跟蹤報告的結果。 圖 21. 緩沖池跟蹤報告
下拉滾動條,查看緩沖池分析的具體內容。 圖 22. 緩沖池分析的具體內容
方法 上一頁12345678910下一頁 Buffer Pool Analysis 中提供了緩沖池跟蹤報告,它以 HTML 的格式顯示,或者以可選的圖形交互式報告格式顯示。 緩沖池命中率 這個比率說明了為頁面請求提供服務時,數據庫治理器不需從磁盤裝入頁(即該頁已經在緩沖池中)就能處理頁請求的時間百分比。 計算: BPHR = (1 - ((緩沖池數據物理讀 + 緩沖池索引物理讀) / (緩沖池數據邏輯讀 + 緩沖池索引邏輯讀) ) ) * 100% 索引命中率 這個比率表明了可以在緩沖池中找到的頁面能夠滿足的對索引頁的所有讀請求所占的百分比。 計算: IHR = (1 - (緩沖池索引物理讀 / 緩沖池索引邏輯讀) ) ) * 100% 數據命中率 這個比率說明了可以在緩沖池中找到的頁面能夠滿足的對數據頁的所有讀請求所占的百分比。 計算: DHR = (1 - (緩沖池數據物理讀 / 緩沖池數據邏輯讀) ) ) * 100% 結論 緩沖池命中率大于 80% 被認為是理想的。對于 OLTP 系統來說,該值的理想情況是盡可能接近于 100% (索引命中率更是如此)。 要提高緩沖池的命中率,可以增加緩沖池的大小,也可以考慮分配多個緩沖池,可以為每個經常訪問的具有自己的表空間的大型表使用一個緩沖池,也可以為一組小型表使用一個緩沖池。 監視系統的健康狀況 DB2 PE 步驟 在 System Overview 面板中選擇 System Health。 圖 23. System overview
在導航器中選擇 Data View。 圖 24. Data view
右擊 Open PRedefined Data View。 圖 25. Open Predefined Data View
選擇您要監視的數據庫。 圖 26. Open Predefined Data View - 選擇數據庫
圖 27給出了系統健康狀況視圖的一個例子。 圖 27. System Health View
方法 System Health 視圖以圖形化的方式在數據視圖中顯示了很多重要的性能計數器。您可以使用預定義的數據視圖,也可以定制自己的數據視圖。 結論 System Health 是一個理想的圖形化監視重要性能指標的工具。一旦定義之后,它們就可以用來在 System Overview 面板中顯示系統性能數據。 結束語 本系列文章的第1部分對 DB2 Performance Expert 進行了簡介,第2部分又展示了可以用來簡化數據庫調優任務和系統治理工作的具體方法。您可以使用 DB2 PE 來幫助理解影響性能的多個因素,例如索引、緩沖池的使用、語句緩存、鎖、重構要求等等。另外,它還可以用來存儲性能數據,供以后分析,并根據您定義的各種因素產生警報。 致謝 非凡感謝 IBM 開發實驗室的 DB2 性能專家 Ute Baumbach,是他審校了這篇文章;感謝 IBM 美國高級技術支持中心的 Cintia Y Ogura,是他為本文提供了教學材料。 上一頁12345678910 新聞熱點
疑難解答