1. 程式人生 > >(轉)SQLServer_十步優化SQL Server中的資料訪問四

(轉)SQLServer_十步優化SQL Server中的資料訪問四

            原文地址:http://tech.it168.com/a2009/1125/814/000000814758_all.shtml

第八步:使用SQL事件探查器和效能監控工具有效地診斷效能問題

  在SQL Server應用領域SQL事件探查器可能是最著名的效能故障排除工具,大多數情況下,當得到一個性能問題報告後,一般首先啟動它進行診斷。

  你可能已經知道,SQL事件探查器是一個跟蹤和監控SQL Server例項的圖形化工具,主要用於分析和衡量在資料庫伺服器上執行的TSQL效能,你可以捕捉伺服器例項上的每個事件,將其儲存到檔案或表中供以後分析。例如,如果生產資料庫速度很慢,你可以使用SQL事件探查器檢視哪些儲存過程執行時耗時過多。

  SQL事件探查器的基本用法

  你可能已經知道如何使用它,那麼你可以跳過這一小節,但我還是要重複一下,也許有許多新手閱讀本文。

  1)啟動SQL事件探查器,連線到目標資料庫例項,建立一個新跟蹤,指定一個跟蹤模板(跟蹤模板預置了一些事件和用於跟蹤的列),如圖1所示;

  圖 1 選擇跟蹤模板

  2)作為可選的一步,你還可以選擇特定事件和列

  圖 2 選擇跟蹤過程要捕捉的事件

  3)另外你還可以點選“組織列”按鈕,在彈出的視窗中指定列的顯示順序,點選“列過濾器”按鈕,在彈出的視窗中設定過濾器,例如,通過設定資料庫的名稱(在like文字框中),只跟蹤特定的資料庫,如果不設定過濾器,SQL事件探查器會捕捉所有的事件,跟蹤的資訊會非常多,要找出有用的關鍵資訊就如大海撈針。

  圖 3 過濾器設定

  4)執行事件探查器,等待捕捉事件

  圖 4 執行事件探查器

  5)跟蹤了足夠的資訊後,停掉事件探查器,將跟蹤資訊儲存到一個檔案中,或者儲存到一個數據表中,如果儲存到表中,需要指定表名,SQL Server會自動建立表中的欄位。

  圖 5 將探查器跟蹤資料儲存到表中

  6)執行下面的SQL查詢語句找出執行代價較高的TSQL

SELECT TextData,Duration,…, FROM Table_Name ORDER BY

  Duration DESC

  圖 6 查詢成本最高的TSQL/儲存過程

  有效利用SQL事件探查器排除與效能相關的問題

  SQL事件探查器除了可以用於找出執行成本最高的那些TSQL或儲存過程外,還可以利用它許多強大的功能診斷和解決其它不同型別的問題。當你收到一個性能問題報告後,或者想提前診斷潛在的效能問題時都可以使用SQL事件探查器。下面是一些SQL事件探查器使用技巧,或許對你有幫助。

  1)使用現有的模板,但需要時應建立你自己的模板

  大多數時候現有的模板能夠滿足你的需求,但當診斷一個特殊型別的資料庫效能問題時(如資料庫發生死鎖),你可能需要建立自己的模板,在這種情況下,你可以點選“檔案”*“模板”*“新建模板”建立一個新模板,需要指定模板名、事件和列。當然也可以從現有的模板修改而來。

  圖 7 建立一個新模板

  圖 8 為新模板指定事件和列

  2)捕捉表掃描(TableScan)和死鎖(DeadLock)事件

  沒錯,你可以使用SQL事件探查器監聽這兩個有趣的事件。

  先假設一種情況,假設你已經在你的測試庫上建立了合適的索引,經過測試後,現在你已經將索引應用到生產伺服器上了,但由於某些不明原因,生產資料庫的效能一直沒達到預期的那樣好,你推測執行查詢時發生了表掃描,你希望有一種方法能夠檢測出是否真的發生了表掃描。

  再假設另一種情況,假設你已經設定好了將錯誤郵件傳送到一個指定的郵件地址,這樣開發團隊可以第一時間獲得通知,並有足夠的資訊進行問題診斷。某一天,你突然收到一封郵件說資料庫發生了死鎖,並在郵件中包含了資料庫級別的錯誤程式碼,你需要找出是哪個TSQL創造了死鎖。

  這時你可以開啟SQL事件探查器,修改一個現有模板,使其可以捕捉表掃描和死鎖事件,修改好後,啟動事件探查器,執行你的應用程式,當再次發生表掃描和死鎖事件時,事件探查器就可以捕捉到,利用跟蹤資訊就可以找出執行代價最高的TSQL。

  注意:從SQL Server日誌檔案中可能也可以找到死鎖事件記錄,在某些時候,你可能需要結合SQL Server日誌和跟蹤資訊才能找出引起資料庫死鎖的資料庫物件和TSQL。

  圖 9 檢測表掃描

  圖 10 檢測死鎖

  3)建立重放跟蹤

  某些時候,為了解決生產資料庫的效能問題,你需要在測試伺服器上模擬一個生產環境,這樣可以重演效能問題。使用SQL事件探查器的TSQL_Replay模板捕捉生產庫上的事件,並將跟蹤資訊儲存為一個.trace檔案,然後在測試伺服器上播放跟蹤檔案就可以重現效能問題是如何出現的了。

  圖 11 建立重放跟蹤

  4)建立優化跟蹤

  資料庫調優顧問是一個偉大的工具,它可以給你提供很好的調優建議,但要真正從它那獲得有用的建議,你需要模擬出與生產庫一樣的負載,也就是說,你需要在測試伺服器上執行相同的TSQL,開啟相同數量的併發連線,然後執行調優顧問。SQL事件探查器的Tuning模板可以捕捉到這類事件和列,使用Tuning模板執行事件探查器,捕捉跟蹤資訊並儲存,通過調優顧問使用跟蹤檔案在測試伺服器上建立相同的負載。

  圖 12 建立Tuning事件探查器跟蹤

  5)捕捉ShowPlan在事件探查器中包括SQL執行計劃

  有時相同的查詢在測試伺服器和生產伺服器上的效能完全不一樣,假設你遇到這種問題,你應該仔細檢視一下生產資料庫上TSQL的執行計劃。但問題是現在不能在生產庫上執行這個TSQL,因為它已經有嚴重的效能問題。這時SQL事件探查器可以派上用場,在跟蹤屬性中選中ShowPlan或ShowPlan XML,這樣可以捕捉到SQL執行計劃和TSQL文字,然後在測試伺服器上執行相同的TSQL,並比較兩者的執行計劃。

  圖 13 指定捕捉執行計劃

  圖 14 在事件探查器跟蹤中的執行計劃

  使用效能監視工具(PerfMon)診斷效能問題

  當你的資料庫遇到效能問題時,大多數時候使用SQL事件探查器就能夠診斷和找出引起效能問題的背後原因了,但有時SQL事件探查器並不是萬能的。

  例如,在生產庫上使用SQL事件探查器分析查詢執行時間時,對應的TSQL執行很慢(假設需要10秒),但同樣的TSQL在測試伺服器上執行時間卻只要200毫秒,通過分析執行計劃和資料列,發現它們都沒有太大的差異,因此在生產庫上肯定有其它問題,那該如何揪出這些問題呢?

  此時效能監視工具(著名的PerfMon)可以幫你一把,它可以定期收集硬體和軟體相關的統計資料,還有它是內置於Windows作業系統的一個免費的工具。

  當你向SQL Server資料庫傳送一條TSQL語句,會產生許多相關的執行參與者,包括TSQL執行引擎,伺服器快取,SQL優化器,輸出佇列,CPU,磁碟I/O等,只要這些參與者任何一環執行節奏沒有跟上,最終的查詢執行時間就會變長,使用效能監視工具可以對這些參與者進行觀察,以找出根本原因。

  使用效能監視工具可以建立多個不同的效能計數器,通過圖形介面分析計數器日誌,此外還可以將效能計數器日誌和SQL事件探查器跟蹤資訊結合起來分析。

  效能監視器基本用法介紹

  Windows內建了許多效能監視計數器,安裝SQL Server時會新增一個SQL Server效能計數器,下面是建立一個性能計數器日誌的過程。

  1)在SQL事件探查器中啟動效能監視工具(“工具”*“效能監視器”);

  圖 15 啟動效能監視工具

  2)點選“計數器日誌”*“新建日誌設定”建立一個新的效能計數器日誌

  圖 16 建立一個性能計數器日誌

  指定日誌檔名,點選“確定”。

  圖 17 為效能計數器日誌指定名字

  3)點選“新增計數器”按鈕,選擇一個需要的計數器

  圖 18 為效能計數器日誌指定計數器

  4)從列表中選擇要監視的物件和對應的計數器,點選“關閉”

  圖 19 指定物件和對應的計數器

  5)選擇的計數器應顯示在窗體中

  圖 20 指定計數器

  6)點選“日誌檔案”標籤,再點選“配置”按鈕,指定日誌檔案儲存位置,如果需要現在還可以修改日誌檔名

  圖 21 指定效能計數器日誌檔案儲存位置

  7)點選“排程”標籤,指定一個時間讀取計數器效能,寫入日誌檔案,也可以選擇“手動”啟動和停止計數器日誌。

  圖 22 指定效能計數器日誌執行時間

  8)點選“常規”標籤,指定收集計數器資料的間隔時間

  圖 23 設定計數器間隔取樣時間

  9)點選“確定”,選擇剛剛建立的計數器日誌,點選右鍵啟動它。

  圖 24 啟動效能計數器日誌

  10)為了檢視日誌資料,再次開啟效能監視工具,點選檢視日誌圖示(紅色),在“源”標籤上選中“日誌檔案”單選按鈕,點選“新增”按鈕新增一個日誌檔案。

  圖 25 檢視效能計數器日誌

  11)預設情況下,在日誌輸出中只有三個計數器被選中,點選“資料”標籤可以追加其它計數器。

  圖 26 檢視日誌資料時追加計數器

  12)點選“確定”,返回圖形化的效能計數器日誌輸出介面

  圖 27 檢視效能計數器日誌

  關聯效能計數器日誌和SQL事件探查器跟蹤資訊進行深入的分析

  通過SQL事件探查器可以找出哪些SQL執行時間過長,但它卻不能給出導致執行時間過長的上下文資訊,但效能監視工具可以提供獨立元件的效能統計資料(即上下文資訊),它們正好互補。

  如果相同的查詢在生產庫和測試庫上的執行時間差別過大,那說明測試伺服器的負載,環境和查詢執行上下文都和生產伺服器不一樣,因此需要一種方法來模擬生產伺服器上的查詢執行上下文,這時就需要結合SQL事件探查器的跟蹤資訊和效能監視工具的效能計數器日誌。

  將二者結合起來分析可以更容易找出效能問題的根本原因,例如,你可能發現在生產伺服器上每次查詢都需要10秒,CPU利用率達到了100%,這時就應該放下SQL調優,先調查一下為什麼CPU利用率會上升到100%。

  關聯SQL事件探查器跟蹤資訊和效能計數器日誌的步驟如下:

  1)建立效能計數器日誌,包括下列常見的效能計數器,指定“手動”方式啟動和停止計數器日誌:

  --網路介面\輸出佇列長度

  --處理器\%處理器時間

  --SQL Server:緩衝管理器\緩衝區快取命中率

  --SQL Server:緩衝管理器\頁面生命週期

  --SQL Server:SQL統計\批量請求數/秒

  --SQL Server:SQL統計\SQL 編譯

  --SQL Server:SQL統計\SQL 重新編譯/秒

  建立好效能計數器日誌,但不啟動它。

  2)使用SQL事件探查器TSQL Duration模板建立一個跟蹤,新增“開始時間”和“結束時間”列跟蹤,同時啟動事件探查器跟蹤和前一步建立的效能計數器日誌;

  3)跟蹤到足夠資訊後,同時停掉SQL事件探查器跟蹤和效能計數器日誌,將SQL事件探查器跟蹤資訊儲存為一個.trc檔案;

  4)關閉SQL事件探查器跟蹤視窗,再使用事件探查器開啟.trc檔案,點選“檔案”*“匯入效能資料”關聯效能計數器日誌,此時會開啟一個檔案瀏覽器視窗,選擇剛剛儲存的效能計數器日誌檔案進行關聯;

  5)在開啟的視窗中選擇所有計數器,點選“確定”,你將會看到下圖所示的介面,它同時顯示SQL事件探查器的跟蹤資訊和效能計數器日誌;

  圖 28 關聯SQL事件探查器和效能監視工具輸出

  6)在事件探查器跟蹤資訊輸出中選擇一條TSQL,你將會看到一個紅色豎條,這代表這條TSQL執行時相關計數器的統計資料位置,同樣,點選效能計數器日誌輸出曲線中高於正常值的點,你會看到對應的TSQL在SQL事件探查器輸出中也是突出顯示的。

  我相信你學會如何關聯這兩個工具的輸出資料後,一定會覺得非常方便和有趣。

  小結

  診斷SQL Server效能問題的工具和技術有很多,例如檢視SQL Server日誌檔案,利用調優顧問(DTA)獲得調優建議,無論使用哪種工具,你都需要深入瞭解內部的細節原因,只有找出最根本的原因之後,解決效能問題才會得心應手。

  本系列最後一篇將介紹如何優化資料檔案和應用分割槽。

  優化技巧主要是面向DBA的,但我認為即使是開發人員也應該掌握這些技巧,因為不是每個開發團隊都配有專門的DBA的。