忘了說明:本系列文章出自《Microsoft SQL Server 2012 Performance Tuning Cookbook》,將會陸續推出譯文,但是由于工作需要,沒有按順序貼出來。
本系列文章包含三部分:
1、 ? 使用系統統計函數( system statistical functions )來監控系統健康程度。
2、 ? 使用系統存儲過程來監控 SQLServer 進程和會話。
3、 ? 使用 DBCC SQLPERF 命令來監控日志空間使用情況。
?
前言:
???????? SQLServer 提供了一些系統函數、系統存儲過程和 DBCC 命令來分析 SQLServer 性能相關的問題,不過絕大部分這些工具所獲得的信息都可以通過 DMVs 和 DMFs 來獲得。很多人依舊使用本文的工具的原因是因為他們長期使用這些工具來監控 SQLServer ,已經成為了一個習慣,所以為了向后兼容,微軟依舊保留這些工具,但是建議新入門的人盡可能從 DMO ( DMVs 和 DMFs 的統稱)中獲取信息。
?
????? 性能監控有很多工具, SQL Profiler 、擴展事件、 DMO 及本系列文章提供的工具等,來獲取信息,對于簡單的性能問題,使用某一種即可,但是對于復雜的性能問題,往往需要多個工具協同使用。
?
下面先介紹使用系統統計函數來監控 SQLServer 的健康程度。
?
使用系統統計函數來監控 SQLServer
?
??????? SQLServer 提供了一些列非常有用的系統統計函數來監控當前 SQLServer 的狀態。這些函數用于檢查和監控服務器的健康狀態非常有效。
?
?????? 現在假設一個情況,在你的數據庫環境中,一個 web 應用程序對數據集的操作是一行一行的。為了讀取每一行,應用程序會在數據庫中往返訪問,導致經常需要開啟新的連接。為了處理這個問題,需要經常監控 SQLServer 的連接數,下面將演示如何操作。
?
準備工作:
?
SQLServer 提供了下面這些有用的系統函數:
?
@@CONNECTIONS @@TIMETICKS @@CPU_BUSY @@IDLE @@IO_BUSY @@PACK_RECEIVED @@PACK_SENT @@PACKET_ERRORS @@TOTAL_READ @@TOTAL_WRITE @@TOTAL_ERRORS
?
本例子中將使用這些函數,并創建腳本來獲取信息。
?
環境準備:
?
使用 SQLServer2008 企業版(本機只有企業版)和示例數據庫 AdventureWorks 。
?
步驟:
?
1、 ? 打開 SQLServer (這里使用 SQLServer Management Studio 后面簡稱 SSMS ),然后新開一個查詢窗口( ctrl+m )。
?
2、 ? 在窗口上輸入一下腳本:
?
--創建一個表來存儲統計信息 IF OBJECT_ID('[dbo].[tbl_ServerHealthStatistics]') IS NULL BEGIN CREATE TABLE [dbo].[tbl_ServerHealthStatistics] ( ID INT IDENTITY(1, 1) , StatDateTime DATETIME DEFAULT GETDATE() , TotalConnections INT , TimeTicks INT , TotalCPUBusyTime INT , TotalCPUIdleTime INT , TotalIOBusyTime INT , TotalReceivedPackets INT , TotalSentPackets INT , TotalErrorsInNetworkPackets INT , TotalPhysicalReadOperations INT , TotalWriteOperations INT , TotalReadWriteErrors INT ) END GO --收集信息到表中 INSERT INTO [dbo].[tbl_ServerHealthStatistics] ( TotalConnections , TimeTicks , TotalCPUBusyTime , TotalCPUIdleTime , TotalIOBusyTime , TotalReceivedPackets , TotalSentPackets , TotalErrorsInNetworkPackets , TotalPhysicalReadOperations , TotalWriteOperations , TotalReadWriteErrors ) SELECT @@CONNECTIONS TotalConnections , @@TIMETICKS TimeTicks , @@CPU_BUSY TotalCPUBusyTime , @@IDLE TotalCPUIdleTime , @@IO_BUSY TotalIOBusyTime , @@PACK_RECEIVED TotalReceivedPackets , @@PACK_SENT TotalSentPackets , @@PACKET_ERRORS TotalErrorsInNetworkPackets , @@TOTAL_READ TotalPhysicalReadOperations , @@TOTAL_WRITE TotalWriteOperations , @@TOTAL_ERRORS TotalReadWriteErrors
?
3、運行下面腳本,顯示收集的服務器信息:
?
WITH cteStatistics AS ( SELECT * FROM [dbo].[tbl_ServerHealthStatistics] ) SELECT Cur.TotalConnections AS CurrentConnections , Cur.StatDateTime AS CurrentStatDateTime , Prev.TotalConnections AS PreviousConnections , Prev.StatDateTime AS Previous_StatDateTime , Cur.TotalConnections - Prev.TotalConnections AS ConnectionsIncreamentedBy , DATEDIFF(millisecond, Prev.StatDateTime, Cur.StatDateTime) AS ConnectionsIncreamentedIn FROM cteStatistics AS Cur LEFT JOIN cteStatistics AS Prev ON Cur.ID = Prev.ID + 1
?
分析:
??????? 上面例子中,先創建一個表 [dbo] . [tbl_ServerHealthStatistics] ,在創建之前,使用 OBJECT_ID() 函數來檢查是否存在該表,如果存在則不創建,這是一個良好的編程習慣,建議在創建表(無論是實體表還是臨時表)時使用??梢源_保腳本可重復執行。
?
??????? 步驟 2 的腳本中,通過 INSERT..SELECT 語句來收集數據并插入到表中。
?
??????? 步驟 3 中,由于需要對比兩行之間的數據,所以使用 CTE ( 2005 之前可以使用臨時表)來暫時存放數據然后與目前數據做對比。
?
?
擴展信息:
?
下面是這些系統統計函數的簡介,這些函數均返回從 SQLServer 啟動以來的匯總值。
?
??????? @@Connections:這個函數返回SQLServer自啟動以來,嘗試連接到SQLServer的連接數,是一個數值型結果。不管這些連接是否成功,均會記錄在里面。
?
????@@MAX_CONNECTIONS:返回允許同時連接的最大連接數,這個數與使用sp_configure 來配置的Max Connections值相同。也和SQLServer的版本和應用程序、硬件的限制有關。
?
????@@TIMETICKS:返回一個微妙級別的計數點。這個值依賴于操作系統的時間系統。通常為31.50毫秒。
?
?????? @@CPU_BUSY :返回自SQLServer服務啟動以來的工作時間,結果為所有CPU事件的累計,所以可能會超出實際時間,乘以@@TIMETICKS即可換成為妙。注意:如果@@CPU_BUSY 或 @@IO_BUSY 中返回的時間超過累積的 CPU 時間約 49 天,則您將收到算術溢出警告。在這種情況下,@@CPU_BUSY、@@IO_BUSY 和 @@IDLE 變量值并不精確。
?
??? @@IDLE:表示SQLServer空閑時的CPU時間。在多處理器情況下,返回值為所有CPU的匯總。
?
??? @@IO_BUSY:返回SQLServer自啟動以來執行輸入輸出操作的CPU總數。
?
??? @@PACK_RECEIVED:返回SQLServer接收到的網絡包總數。
?
??? @@PACK_SENT:返回SQLServer發送的網絡報總數。
?
??? @@PACKET_ERRORS:返回SQLServer所遇到過的網絡包錯誤的總數。
?
??? @@TOTAL_READ:返回SQLServer所執行過的所有物理讀操作總數。
?
??? @@TOTAL_WRITE:返回所有物理寫操作的總數。
?
??? @@TOTAL_ERRORS:返回SQLServer遇到過的所有讀寫操作的錯誤總數。
?
注意 : @@CPU_BUSY 、 @@IDLE 和 @@IO_BUSY 返回的值是基于 ticks 而不是毫秒或者微妙。如果想知道微妙值,可以乘以 @@timeticks 。
?
??????? 本例中的腳本收集某個時間點的 SQLServer 信息,可以借助 SQLServer Agent ,來定期、自動收集,以便用于后續分析之用。
?
?????? 另外,sp_monitor系統存儲過程可以返回本例中的信息,但是返回的結果集比較多,可能需要做二次處理來獲取。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
