自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQL點滴之收集SQL Server線程等待信息

數(shù)據(jù)庫 SQL Server
要知道線程等待時間是制約SQL Server效率的重要原因,這一個隨筆中將學(xué)習(xí)怎樣收集SQL Server中的線程等待時間,類型等信息,這些信息是進(jìn)行數(shù)據(jù)庫優(yōu)化的依據(jù)。

 

要知道線程等待時間是制約SQL Server效率的重要原因,這一個隨筆中將學(xué)習(xí)怎樣收集SQL Server中的線程等待時間,類型等信息,這些信息是進(jìn)行數(shù)據(jù)庫優(yōu)化的依據(jù)。

sys.dm_os_wait_stats

這是一個系統(tǒng)視圖,里面存儲線程所遇到的所有的等待信息,具體的列如下表

列名

數(shù)據(jù)類型

說明

Wait_type

Nvarchar(60)

等待類型名稱

waiting_tasks_count

Bigint

等待類型的等待數(shù)。該計數(shù)器在每開始一個等待時便會增加。

Wait_time_ms

Bigint

該等待類型的總等待時間。

Max_wait_time_ms

Bigint

該等待類型的最長等待時間。

Signal_wait_time_ms

Bigint

正在等待的線程從收到信號通知到開始運行之間的時差。

要注意的是,這個視圖的信息每次關(guān)閉SQL Server的時候都會自動清除,下次打開SQL Server的時候又會重新開始統(tǒng)計。

新建線程等待信息表

如果想得到連續(xù)的信息,在固定時間間隔內(nèi)收集信息比如一個小時一次,這樣就可以分析系統(tǒng)分配的等待時間,識別出繁忙時間段。這里我們將這些信息收集到一個數(shù)據(jù)表中保存并進(jìn)行分析。使用下面的語句新建一個表:

  1. use AdventureWorks  
  2. CREATE TABLE dbo.WaitStats  
  3. (  
  4. dt DATETIME NOT NULL DEFAULT (CURRENT_TIMESTAMP),  
  5. wait_type NVARCHAR(60) NOT NULL,  
  6. waiting_tasks_count BIGINT NOT NULL,  
  7. wait_time_ms BIGINT NOT NULL,  
  8. max_wait_time_ms BIGINT NOT NULL,  
  9. signal_wait_time_ms BIGINT NOT NULL 
  10. );  
  11. CREATE UNIQUE CLUSTERED INDEX idx_dt_type ON dbo.WaitStats(dt, wait_type);  
  12. CREATE INDEX idx_type_dt ON dbo.WaitStats(wait_type, dt); 

新建job填充數(shù)據(jù)

要收集信息最好是用一個job來定時地執(zhí)行insert語句填充數(shù)據(jù),下面介紹步驟

點擊數(shù)據(jù)庫中的SQL Server Agent,展開,右擊jobs文件夾,右擊新建。如圖1

在新建job界面,General標(biāo)簽中填寫job名稱,描述,如圖2

點擊Setps標(biāo)簽,點擊新建按鈕,在新建step界面內(nèi)設(shè)置Step Name,Type,DataBase,Command等屬性,如下圖3。這些屬性一看就知道是要做什么的,就不一一的解釋了。還要說的 是截圖是建好的job,如果你自己做的話對話框顯示的標(biāo)題可能不一樣。

Command屬性是設(shè)置要執(zhí)行的SQL語句或存儲過程等等,這里設(shè)置如下的SQL Script:

  1. INSERT INTO Performance.dbo.WaitStats  
  2. (wait_type, waiting_tasks_count, wait_time_ms,  
  3. max_wait_time_ms, signal_wait_time_ms)  
  4. SELECT 
  5. wait_type, waiting_tasks_count, wait_time_ms,  
  6. max_wait_time_ms, signal_wait_time_ms  
  7. FROM sys.dm_os_wait_stats 

點擊Shedules標(biāo)簽,設(shè)置job的執(zhí)行計劃,這里設(shè)置的是每天的每5分鐘執(zhí)行一次如圖4

上述步驟包含了新建一個job的主要設(shè)置,其他的細(xì)節(jié)信息沒有包含,遇到具體問題再具體分析吧。

收集等待信息數(shù)據(jù)

過一段時間之后在表WaitStats中就會有一些數(shù)據(jù),每隔5分鐘就會在這個表中寫入一些數(shù)據(jù),這些數(shù)據(jù)會不斷的增加。這里為了得到相鄰間隔之間線程等待時間的變化就要使用自連接,連接條件是等待類型相同,當(dāng)前行號等于上一個的行號加上1,然后就可以用上一次等待時間減去這一次的等待時間得到這個變化值,下面使用一個函數(shù)來實現(xiàn)這個邏輯:

  1. IF OBJECT_ID('dbo.IntervalWaits''IF'IS NOT NULL 
  2. DROP FUNCTION dbo.IntervalWaits;  
  3. GO  
  4. CREATE FUNCTION dbo.IntervalWaits  
  5. (@fromdt AS DATETIME, @todt AS DATETIME)  
  6. RETURNS TABLE 
  7. AS 
  8. RETURN 
  9. WITH Waits AS 
  10. (  
  11. SELECT dt, wait_type, wait_time_ms,  
  12. ROW_NUMBER() OVER(PARTITION BY wait_type  
  13. ORDER BY dt) AS rn  
  14. FROM dbo.WaitStats  
  15. )  
  16. SELECT Prv.wait_type, Prv.dt AS start_time,  
  17. CAST((Cur.wait_time_ms - Prv.wait_time_ms)  
  18. / 1000. AS NUMERIC(12, 2)) AS interval_wait_s  
  19. FROM Waits AS Cur  
  20. JOIN Waits AS Prv  
  21. ON Cur.wait_type = Prv.wait_type  
  22. AND Cur.rn = Prv.rn + 1  
  23. AND Prv.dt >= @fromdt  
  24. AND Prv.dt < DATE 
  25. ADD(day, 1, @todt)  
  26. GO 

這個函數(shù)接受兩個參數(shù),開始統(tǒng)計時間,結(jié)束統(tǒng)計時間,返回等待變化的時間,并按照類型排序。調(diào)用這個函數(shù)如下:

SELECT wait_type, start_time, interval_wait_s

FROM dbo.IntervalWaits('20110509', '20110510') AS F

ORDER BY SUM(interval_wait_s) OVER(PARTITION BY wait_type) DESC,wait_type,start_time;

但是我們不能每次都去調(diào)用這個函數(shù),所以可以吧這個查詢放在一個視圖里面,外部只需要使用視圖來查詢數(shù)據(jù)就可以了:

  1. IF OBJECT_ID('dbo.IntervalWaitsSample''V'IS NOT NULL 
  2. DROP VIEW dbo.IntervalWaitsSample;  
  3. GO  
  4. CREATE VIEW dbo.IntervalWaitsSample  
  5. AS 
  6. SELECT wait_type, start_time, interval_wait_s  
  7. FROM dbo.IntervalWaits('20090212''20090215')   
  8. AS F;  
  9. GO 

從視圖中查詢得到的數(shù)據(jù)就是我們要得到的數(shù)據(jù)。但是這些并不明顯,先寫到這里,下一個隨筆我將在EXECL中把這些數(shù)據(jù)制作成一個直方圖或者連線圖,橫軸是時間,縱軸是等待間隔時間。這樣就會更加直觀地看到在那些時間SQL Server的線程等待時間最長,也就是最繁忙的時候。

原文鏈接:http://www.cnblogs.com/tylerdonet/archive/2011/05/10/2042447.html

 

【編輯推薦】

  1. 淺述遠(yuǎn)程Service Broker的實現(xiàn)
  2. Service Broker基礎(chǔ)應(yīng)用(下)
  3. Service Broker基礎(chǔ)應(yīng)用(上)
  4. 簡述Service Broker事件通知功能
  5. SQL使用中的點滴回憶

責(zé)任編輯:艾婧 來源: 博客園
相關(guān)推薦

2011-04-21 10:06:40

SQL篩選

2011-06-23 14:00:51

SQL點滴

2011-09-13 10:25:05

數(shù)據(jù)庫點滴

2011-08-02 13:04:40

SQL Server

2011-09-09 10:10:13

SQL數(shù)據(jù)庫點滴

2011-08-03 13:32:00

SQL Server優(yōu)化

2011-04-27 16:34:06

withSQL Server

2011-04-22 15:00:22

SQLwin7登錄

2011-04-21 13:49:29

dementionSQL

2011-04-27 16:09:48

SQL ServerSSIS

2018-04-19 09:02:14

SQL ServerSQL性能優(yōu)化

2011-04-27 14:27:11

SQL Server

2018-12-25 14:40:04

SQL ServerSQL語句數(shù)據(jù)庫

2010-04-30 12:38:38

Oracle進(jìn)程

2011-04-20 11:11:33

SQLSET QUOTED_

2011-04-28 09:49:56

SQLwith子查詢

2011-04-27 15:55:16

2011-05-24 15:02:21

OracleSQL

2011-08-19 10:40:27

SQL Server Merge命令

2011-10-09 16:40:50

T-SQL
點贊
收藏

51CTO技術(shù)棧公眾號