婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > SQLServer中使用擴展事件獲取Session級別的等待信息及SQLServer 2016中Session級別等待信息的增強

SQLServer中使用擴展事件獲取Session級別的等待信息及SQLServer 2016中Session級別等待信息的增強

熱門標簽:奧威地圖標注多個地方 智能語音外呼系統選哪家 京華物流公司地圖標注 外呼系統電銷專用 千呼電銷機器人價格 百度地圖標注不同路線 武漢長沙外呼系統方法和技巧 優質地圖標注 怎樣在地圖上標注路線圖標

什么是等待

簡單說明一下什么是等待:

當應用程序對SQL Server發起一個Session請求的時候,這個Session請求在數據庫中執行的過程中會申請其所需要的資源,

比如可能會申請內存資源,表上的鎖資源,物理IO資源,網絡資源等等,

如果當前Session運行過程中需要申請的某些資源無法立即得到滿足,就會產生等待。

SQL Server會以不用的方式來展現這個等待信息,比活動Session的等待信息,實例級的等待信息等等。

SQL Server中,等待事件是作為DBA進行TroubleShooting的重要參考信息之一,SQL Server中可以通過多中方式來獲取等待信息。

但是對于SQL Server 2016之前的版本來說,不管是活動Session級別的等待和實例級的等待,參考意義都有限,

更多的時候是想要更加詳細的且可以事后分析的等待,這就需要收集那些曾經已執行過的Session產生的等待信息,也就是特定Session等待信息的歷史記錄

本文重點介紹使用擴展事件來捕獲等待信息,但不介紹擴展事件本身的使用,重點放在如何使用擴展事件來獲取想要的等待事件信息。

需要對擴展事件有一定的了解。

等待信息的獲取途徑

在SQL Server中有一個系統視圖sys.dm_os_wait_stats記錄了自數據庫服務啟動以來累積產生的等待信息,

如下圖,這個結果是實例級的,也就是記錄的整個數據庫服務器所有的等待事件的累積。

多數時候參考意義不是很大,比如某一天的網絡延時很高,sys.dm_os_wait_stats中累計記錄了大量的ASYNC_NETWORK_IO等待信息。

但是到了第二天或者什么時候,網絡變好了,但是sys.dm_os_wait_stats中記錄的ASYNC_NETWORK_IO等待信息是不變的

也就是說sys.dm_os_wait_stats無法反映實時等待情況。

當然要獲取實時的等待信息也簡單,記錄兩個時間點之間sys.dm_os_wait_stats中等待時間的差值,可以間接地反映出來某一段時間的數據的等待信息。

但是這個信息仍然比較粗略,依舊是實例級的,某些時候依舊是不足夠作為參考的。

另外一個是通過sys.dm_exec_requests這個系統視圖的wait_type,wait_time等獲取活動Session的等待信息

如截圖,但是這個是活動Session的信息,當Session完成之后,它的等待信息就看不到曾經都產生了那些等待,分別是多久。

也就說,你無法追溯歷史上某一個Session或者某一個SQL(存儲過程)執行過程中的都產生了什么類型的等待,等待了多長時間。

實話說,不管是sys.dm_os_wait_stats還是sys.dm_exec_requests,在正常情況下,獲取到的等待信息實用價值都是不高或者是適用場景有限。

更多的時候我們是想要更細一級的等待,比如某一個Login、某一部分Session、甚至某些特定的SQL(存儲過程)的執行過程中產生的等待信息。

舉個實際例子,數據庫又10個Login給10個不同的應用程序訪問,其中只有1個應用程序端反饋說訪問數據庫慢,或者有性能問題,其他Login都反饋正常

那么很有可能是這個Login請求自己的問題,此時就需要針對這一個Login的情況進行針對性分析,而不是在實例級分析診斷。

如果能夠拿到這個Login執行的Session的等待情況,或者這個Login某些特定的數據庫對象的執行過程中的等待信息,對定位問題的針對性的就比較強了。 

本文就以此為切入點,針對如何獲取Session級別的等待信息展開說明和演示。

SQL Server 2016中獲取Session級別的等待信息

在SQL Server 2016中,獲取Session級別的等待信息是比較方便的,有直接的系統視圖sys.dm_exec_session_wait_stats可以使用

當前情況下,想要知道某一個Session的等待信息就很簡單了,

在sql語句開始的時候把當前Session的等待信息記錄下來

在sql語句結束的時候把當前Session的等待信息再次記錄出來

計算兩次等待信息的差值,就可以知道當前Session運行的過程中有哪些等待,分別是多少。

  sqlserver開發團隊可能也意識到了對于等待信息,更多的時候,需要的是較為具體的等待,而不是一個籠統的實例級的等待

  因此在SQL Server 2016中增加了sys.dm_exec_session_wait_stats這個支持統計Session級別的等待的視圖

  很不幸的SQL Server2016之前的版本中是沒有這個系統視圖可以很方便地記錄Session級別的等待。

  但是可以借助擴展事件來實現類似的功能。

使用擴展事件來捕獲Session級別的等待信息

因為這里是是用擴展事件來實現的,這里要求讀者要對擴展事件有一個基本的認識,擴展事件本身就不多說了。

上代碼,啟動一個擴展事件,來記錄執行時間超過三秒的SQL語句,其執行過程中等待時間大于0的等待事件信息。

當然這個捕獲的信息可以加上各種過濾條件。具體參考代碼備注。

IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='CollectionSessionWaitStats')
 DROP EVENT session CollectionSessionWaitStats ON SERVER;
GO
-- 創建事件會話 
CREATE EVENT SESSION CollectionSessionWaitStats ON SERVER  
ADD EVENT sqlserver.rpc_completed
( 
  ACTION
  (
    sqlos.task_time,
    sqlserver.database_name,
    sqlserver.nt_username,
    sqlserver.username,
    sqlserver.sql_text,
    sqlserver.session_id,
    sqlserver.transaction_id
  ) WHERE [duration]>=3000000
), 
ADD EVENT sqlserver.sql_batch_completed
( 
  ACTION
  (
    sqlos.task_time,
    sqlserver.database_name,
    sqlserver.nt_username,
    sqlserver.username,
    sqlserver.sql_text,
    sqlserver.session_id,
    sqlserver.transaction_id
  ) WHERE [duration]>=3000000
),
ADD EVENT sqlos.wait_info
(
  ACTION 
  (
    sqlos.task_time,
    sqlserver.database_name,
    sqlserver.nt_username,
    sqlserver.sql_text,
    sqlserver.username,
    sqlserver.session_id,
    sqlserver.transaction_id
  ) WHERE session_id>50 
      and opcode=1 
      and duration>0
      and sql_text not like '%sp_MScdc_capture_job%' --排除某些信息
      --and username = '' --限定只記錄某些信息
),
ADD EVENT sqlos.wait_info_external
(
  ACTION
  (
    sqlos.task_time,
    sqlserver.database_name,
    sqlserver.nt_username,
    sqlserver.username,
    sqlserver.sql_text,
    sqlserver.session_id,
    sqlserver.transaction_id
  ) WHERE  session_id>50 
      and opcode=1 
      and duration>0
      and sql_text not like '%sp_MScdc_capture_job%'
      --and username = ''
)
ADD TARGET package0.event_file
( 
  SET filename=N'D:\XEventFiles\CollectionSessionWaitStats',
  max_file_size=(1024),  
  max_rollover_files=(10) 
)
WITH ( 
    MAX_MEMORY=4096 KB,      
    EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
    MAX_DISPATCH_LATENCY=30 SECONDS,
    MAX_EVENT_SIZE=0 KB,      
    MEMORY_PARTITION_MODE=NONE,   
    TRACK_CAUSALITY=OFF,      
    STARTUP_STATE=ON
  )
GO
-- 啟用(停止)事件會話(START / STOP) 
ALTER EVENT SESSION CollectionSessionWaitStats ON SERVER STATE=START 
GO

是用擴展事件收集的Session級別的等待信息有以下幾個特點

1,SessionId是可以重復的

  舉例說明就是:比如一個SessionId = 80的Session,可以第一次執行一個SQLA,第二次執行一個SQLB.

  同時這兩個SQL的執行與其執行過程中產生的等待信息都可以被捕獲出來

2,同一個時間段內,一個同一個SessionId不可能同時執行,

  比如16:46:36秒到16:46:46秒到這個時間內,SessionId = 80的Session正在執行,擴展事件捕獲到了其產生的等待信息

  但是在16:46:36秒到16:46:46這個時間段內,不可能有另外一個SessionId = 80也在執行,這個邏輯不難理解

為什么要特意說明這個問題?

因為擴展事件收集到的事件信息中SQL語句完成事件(rpc_completed或者sql_batch_completed)與產生的等待之間,沒有一個直接的對應關系。

怎么理解?動起手來才能發現問題,我是這個糾結了大半天,截圖示例。

如下截圖,擴展事件捕獲到的兩個目標事件的SessionId都是58,但是執行的SQL是不一樣的,

如下截圖是不區分事件類型,捕獲到的所有的事件信息。

也就是上面說的,對于58號Session:

第一次運行了SELECT COUNT(1) FROM TestCollectionSessionWaitStats

第二次運行了SELECT COUNT(1) FROM TestCollectionSessionWaitStats WHERE Id>10

兩次運行的SQL一致或者不一致問題不大,關鍵是捕獲到的等待事件信心的SessionId也是58,怎么區分產生的事件是歸屬于哪一次的運行?

比如58號Session運行兩次sql,產生了10條等待信息,怎么區分這10條等待信息哪些歸屬于第一次運行生成的,哪些歸屬于第二次運行生成的?

這個就依靠上面說的第二點“同一個時間段內,一個同一個SessionId不可能同時執行”

對于同一個SessionId,在sql_batch_completed事件中,從時間的維度來看

小于第一次sql_batch_completed事件完成時間的必然是58號Session第一次執行生成的

大于第一次sql_batch_completed事件完成事件的且小于第二次sql_batch_completed的必然是58號Session第二次執行生成的

有了這個理論基礎,我們統計Session級別的等待就比較容易了,相信這個邏輯的實現并不難。

如下圖是58號Session執行某SQL語句產生的等待詳細信息,可以看到多次產生了CXPACKET和 PAGEIOLATCH_SH等待

鑒于截圖問題,下面還有另外一個同樣是58號Session的執行另外一個SQL捕獲到的等待信息

這個統計辦法就是上面提到的,在兩次sql_batch_completed事件中,雖然等待事件的SessionId一樣,

但是其發生的時候是處于當前事件的sql_batch_completed之前,上一次sql_batch_completed之后,

這樣就可以完美地匹配到sql_batch_completed事件與其對應的wait_info事件。

在這種情況下,統計得到類似于SQL Server 2016中的sys.dm_os_wait_stats的結果也就不難了。

與sys.dm_os_wait_stats 等待信息的結果相比,上述通過擴展事件獲取的等待信息,是不是更加詳細和具體?

比如對于CXPACKET等待時間,

不難發現,如果計算計算其產生的次數(count),就類似于sys.dm_os_wait_stats 中的waiting_tasks_count,計算其產生的總時間(sum),就類似于wait_time_ms

但是上述時間的信息已經細化到Session級別了,比sys.dm_os_wait_stats 中的等待信息更有參考價值。
對于問題的診斷和分析,也會是更加有效。

上述統計結果的SQL語句

-- Parse the XML to show rpc_completed,sql_batch_completed details
if object_id('tempdb..#t1') is not null
  drop table #t1
SELECT 
  event_xml.value('(./action[@name="session_id"]/value)[1]', 'INT') as session_id,
  event_xml.value('(./@timestamp)', 'varchar(1000)') as timestamp,
  event_xml.value('(./data[@name="statement"]/value)[1]', 'varchar(max)') as statement,
  event_xml.value('(./data[@name="batch_text"]/value)[1]', 'varchar(max)') as batch_text,
  event_xml.value('(./@name)', 'varchar(1000)') as Event_Name,
  event_xml.value('(./data[@name="duration"]/value)[1]', 'bigint') as Duration,
  event_xml.value('(./data[@name="cpu_time"]/value)[1]', 'bigint') as cpu_time,
  event_xml.value('(./data[@name="physical_reads"]/value)[1]', 'bigint') as physical_reads,
  event_xml.value('(./data[@name="logical_reads"]/value)[1]', 'bigint') as logical_reads,
  event_xml.value('(./action[@name="username"]/value)[1]', 'varchar(max)') as username
INTO #t1
FROM (
    SELECT CAST(event_data AS XML) xml_event_data 
    FROM sys.fn_xe_file_target_read_file(N'D:\XEventFiles\CollectionSessionWaitStats*', NULL, NULL, NULL)
   ) AS event_table
CROSS APPLY xml_event_data.nodes('//event') n (event_xml)
WHERE event_xml.value('(./@name)', 'varchar(1000)') in ('rpc_completed','sql_batch_completed')
order by Event_Name
-- Parse the XML to show wait_info,wait_info_external details
if object_id('tempdb..#t2') is not null
  drop table #t2
SELECT 
  cast(event_xml.value('(./@timestamp)', 'varchar(1000)') as DATETIME2) as timestamp,
  event_xml.value('(./data[@name="duration"]/value)[1]', 'bigint') as duration,
  event_xml.value('(./action[@name="session_id"]/value)[1]', 'INT') as session_id,
  event_xml.value('(./data[@name="wait_type"]/text)[1]', 'VARCHAR(200)') as wait_type
INTO #t2
FROM (
    SELECT CAST(event_data AS XML) xml_event_data 
    FROM sys.fn_xe_file_target_read_file(N'D:\XEventFiles\CollectionSessionWaitStats*', NULL, NULL, NULL)
   ) AS event_table
   CROSS APPLY xml_event_data.nodes('//event') n (event_xml)
WHERE event_xml.value('(./@name)', 'varchar(1000)') in ('wait_info','wait_info_external')
if object_id('tempdb..#t3') is not null
  drop table #t3
SELECT 
  a.session_id          AS SessionId,
  isnull(statement,batch_text)  AS SQLTEXT,
  a.Duration            AS TotalExecuteTime,
  CAST(a.timestamp AS DATETIME2)  AS CompletedTime,
  CAST(b.timestamp AS DATETIME2)  AS WaitTypeStartTime,
  b.wait_type            AS WaitType,
  b.duration            AS WaitDuration
INTO #t3
FROM #t1 a INNER JOIN #t2 b on a.session_id = b.session_id
  and b.timestamp  a.timestamp 
  and b.timestamp>(
             select top 1 timestamp from #t1 c 
             where a.session_id = a.session_id and a.timestamp > b.timestamp
             order by a.timestamp
          )
select 
  case when rn = 1 then SessionId else NULL end as SessionId,
  case when rn = 1 then SQLTEXT else NULL end as SQLTEXT,
  case when rn = 1 then TotalExecuteTime else NULL end as TotalExecuteTime,
  CompletedTime as CompletedTime,
  WaitType,
  WaitTypeStartTime as WaitTypeStartTime,
  WaitDuration
from 
(
  select ROW_NUMBER()over(partition by SessionId,SQLTEXT,TotalExecuteTime,CompletedTime order by CompletedTime,WaitTypeStartTime) as rn,
  * FROM #t3
)

當然該語句僅供參考,目的是為了收集Session級的統計信息,當收集到Session級別的統計信息之后,具體的統計方式也不難。

總結

   等待事件可以幫助我們診斷SQL Server上的一些資源瓶頸,對于問題的處理和解決有著比較重要的參考意義,如果能夠細化地收集等待事件,對于解決問題的參考意義會更大。

   本文通過一個簡單的示例,使用擴展事件來收集SQL Server中一些特定場景下的等待信息,來更加有針對性地進行問題的診斷和識別,使得問題的分析更加高效和具有針對性。

以上所述是小編給大家介紹的SQLServer中使用擴展事件獲取Session級別的等待信息及SQLServer 2016中Session級別等待信息的增強,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

您可能感興趣的文章:
  • sqlserver 模糊查詢常用方法
  • SqlServer使用 case when 解決多條件模糊查詢問題
  • SqlServer中模糊查詢對于特殊字符的處理方法
  • MSSQL Server 查詢優化方法 整理
  • sqlserver 中charindex/patindex/like 的比較
  • SqlServer參數化查詢之where in和like實現之xml和DataTable傳參介紹
  • SqlServer參數化查詢之where in和like實現詳解
  • SqlServer2016模糊匹配的三種方式及效率問題簡析

標簽:宿州 益陽 來賓 威海 銅仁 防疫戰設 天水 七臺河

巨人網絡通訊聲明:本文標題《SQLServer中使用擴展事件獲取Session級別的等待信息及SQLServer 2016中Session級別等待信息的增強》,本文關鍵詞  SQLServer,中,使用,擴展,事件,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQLServer中使用擴展事件獲取Session級別的等待信息及SQLServer 2016中Session級別等待信息的增強》相關的同類信息!
  • 本頁收集關于SQLServer中使用擴展事件獲取Session級別的等待信息及SQLServer 2016中Session級別等待信息的增強的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美日韩免费观看一区三区| 精品污污网站免费看| 亚洲午夜免费福利视频| 亚洲精品国久久99热| 日韩电影在线一区| 大胆欧美人体老妇| 欧美写真视频网站| 久久一区二区三区国产精品| 亚洲欧洲99久久| 青青草国产成人99久久| 久久综合中文字幕| 一区二区三区日本| 免费成人在线影院| 国产精品18久久久久久久久久久久| 95精品视频在线| 成人丝袜18视频在线观看| 99re免费视频精品全部| 亚洲永久免费视频| 中文字幕在线不卡国产视频| 亚洲第一狼人社区| 日韩精品久久理论片| 久久99国产精品久久99果冻传媒| 国产精一品亚洲二区在线视频| 午夜精品久久久| 国产女人水真多18毛片18精品视频| 亚洲国产精品av| 亚洲午夜一二三区视频| 高清beeg欧美| 91精品国产入口| 国产精品久久久久久久第一福利| 三级不卡在线观看| 91麻豆精东视频| 国产欧美日韩三级| 美女视频黄频大全不卡视频在线播放| 99精品视频在线观看| 日韩精品中文字幕一区| 亚洲日本电影在线| 国产精品888| 欧美tickling挠脚心丨vk| 国产精品国产三级国产有无不卡 | 美女脱光内衣内裤视频久久网站 | 欧美一区二区三区免费视频| 国产午夜亚洲精品午夜鲁丝片| 日产国产高清一区二区三区| 99re热视频精品| 亚洲视频网在线直播| 国产精品一区二区你懂的| 日韩午夜在线影院| 日韩黄色在线观看| 欧美老女人第四色| 视频一区二区中文字幕| 色综合天天综合色综合av | 国产精品免费观看视频| 国产成人欧美日韩在线电影| 日韩免费视频一区| 极品销魂美女一区二区三区| 色哟哟一区二区| 亚洲一区在线免费观看| 欧美午夜片在线观看| 悠悠色在线精品| 91亚洲精品久久久蜜桃网站| 日韩理论片中文av| 一本色道综合亚洲| 亚洲一区二区精品视频| 欧美日韩精品综合在线| 26uuu色噜噜精品一区| 久久国产三级精品| 欧美草草影院在线视频| 日韩成人午夜精品| 日韩一区二区精品葵司在线| 丝袜亚洲精品中文字幕一区| 欧美一区二区三区系列电影| 青青草国产成人av片免费| 精品国产露脸精彩对白| 奇米影视一区二区三区| 欧美xxxxxxxxx| 国产精品996| 亚洲青青青在线视频| 91社区在线播放| 婷婷久久综合九色综合伊人色| 欧美一区二区久久久| 国产精品一区一区三区| 国产精品午夜春色av| 色婷婷综合中文久久一本| 一区二区三区**美女毛片| 日韩视频在线一区二区| 福利一区二区在线观看| 亚洲伊人色欲综合网| 日韩亚洲电影在线| 成人av在线一区二区三区| 亚洲综合一区在线| 精品少妇一区二区三区在线播放| 9久草视频在线视频精品| 99久久精品国产一区二区三区| 久久久久国产精品厨房| 成人深夜在线观看| 一区二区三区视频在线看| 91麻豆精品国产91久久久资源速度| 麻豆精品视频在线观看| 国产精品视频九色porn| 欧美乱妇一区二区三区不卡视频| 韩国精品在线观看| 亚洲一区二区黄色| 久久久国产精品麻豆| 色婷婷av久久久久久久| 麻豆久久一区二区| 自拍偷拍亚洲综合| 欧美精品一区在线观看| 欧美亚洲日本一区| 成人av免费在线| 麻豆视频观看网址久久| 一区二区三区在线视频免费观看| 久久新电视剧免费观看| 6080国产精品一区二区| 韩国一区二区在线观看| 亚洲色图制服丝袜| 久久久久久亚洲综合影院红桃 | 7777精品伊人久久久大香线蕉完整版 | 国产精品夜夜爽| 亚洲bt欧美bt精品| 专区另类欧美日韩| 国产欧美一区二区精品性| 69av一区二区三区| 欧美伊人精品成人久久综合97| 国产一区日韩二区欧美三区| 日本aⅴ精品一区二区三区| 一区二区免费视频| 亚洲精品伦理在线| 亚洲欧洲中文日韩久久av乱码| 国产欧美综合在线观看第十页| 精品国产一区二区三区不卡| 欧美一级片在线看| 欧美一区二区视频在线观看2020 | 正在播放一区二区| 欧美精品日韩一本| 欧美性xxxxx极品少妇| 欧美天堂一区二区三区| 一本到不卡免费一区二区| 99国内精品久久| 成人av片在线观看| 91丨国产丨九色丨pron| 91麻豆精品在线观看| 97精品电影院| 在线视频中文字幕一区二区| 91免费看`日韩一区二区| 99久久久久久| 国产精品中文欧美| 国产91丝袜在线18| 成人美女视频在线观看| 成年人国产精品| 99久久精品国产麻豆演员表| 91在线视频免费91| 在线观看国产精品网站| 欧美日本一道本| 在线播放国产精品二区一二区四区 | 亚洲国产精品天堂| 亚洲成人黄色影院| 日韩高清国产一区在线| 美女网站视频久久| 国产一区二区三区在线看麻豆| 国产成人免费xxxxxxxx| 99久久久久久| 正在播放一区二区| 国产区在线观看成人精品 | 午夜精品久久久久久久99樱桃| 日韩国产高清在线| 久久成人羞羞网站| 国产999精品久久久久久 | 亚洲综合成人在线视频| 婷婷中文字幕一区三区| 国产真实乱偷精品视频免| www.av精品| 欧美一区二区三区啪啪| 国产精品看片你懂得| 亚洲第一久久影院| 国产成人综合在线| 欧美日韩成人综合天天影院 | 99国产精品久久久久久久久久久| 欧美日韩高清在线播放| 久久久久久免费| 亚洲精品中文在线影院| 精品一区二区三区久久久| 成人午夜激情在线| 欧美精品在线观看播放| 久久精品这里都是精品| 午夜精品久久久久久久久久久| 成人理论电影网| 日韩女优电影在线观看| 亚洲在线观看免费视频| 国产乱一区二区| 欧美日韩在线三区| 国产精品私人自拍| 看电视剧不卡顿的网站| 欧美综合一区二区| 国产日韩欧美制服另类| 麻豆91在线观看| 欧美综合在线视频| 亚洲欧美自拍偷拍色图| 国产精品18久久久久| 欧美蜜桃一区二区三区 |