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

(轉)SQLServer_十步優化SQL Server中的數據訪問四

數量 著名 數據表 停止 repl 模擬 開發人員 數據庫服務器 命中

原文地址: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的。

(轉)SQLServer_十步優化SQL Server中的數據訪問四