国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

初涉SQL Server性能問題(2/4):列出等待資源的會話

2024-08-31 00:54:23
字體:
來源:轉載
供稿:網友
初涉SQL Server性能問題(2/4):列出等待資源的會話

在初涉SQL Server性能問題(1/4)里,我們知道了如何快速檢查服務器實例上正運行的任務數和IO等待的任務數。這個是輕量級的腳本,不會給服務器造成任何壓力,即使服務器在高負荷下,也可以正常獲得結果。

問題檢測的第2步是獲取在進行任何資源等待的會話。下面的腳本會幫助我們獲得這些信息。這個查詢需要預建立一個函數,如果會話是由SQL Server代理啟動的話,會顯示具體的作業名。

 1 /***************************************************************************************** 2            PREREQUISITE FUNCTION 3 ******************************************************************************************/ 4 USE MASTER 5 GO  6 CREATE FUNCTION ConvertStringToBinary  ( @hexstring  VARCHAR(100) 7 )  RETURNS BINARY(34)  AS 8 BEGIN 9 10    RETURN(SELECT CAST('' AS xml).value('xs:hexBinary( substring(sql:variable("@hexstring"), sql:column("t.pos")) )', 'varbinary(max)')11    FROM (SELECT CASE SUBSTRING(@hexstring, 1, 2) WHEN '0x' THEN 3 ELSE 0 END) AS t(pos))  12 END13 /***************************************************************************************14 STEP 2: List the session which are currently waiting for resource15 ****************************************************************************************/16 SELECT node.parent_node_id AS Node_id,17 es.HOST_NAME,18 es.Login_name,19 CASE WHEN es.program_name LIKE '%SQLAgent - TSQL JobStep%' THEN20          (21           SELECT 'SQL AGENT JOB: '+name FROM msdb..sysjobs WHERE job_id=22           MASTER.DBO.ConvertStringToBinary (LTRIM(RTRIM((SUBSTRING(es.program_name,CHARINDEX('(job',es.program_name,0)+4,35)))))23           )24     ELSE es.program_name END  AS [Program Name] ,25 DB_NAME(er.database_id) AS DatabaseName,26 er.session_id, 27 wt.blocking_session_id,28 wt.wait_duration_ms,29 wt.wait_type,30 wt.NoThread ,31 er.command,32 er.status,33 er.wait_resource,34 er.open_transaction_count,35 er.cpu_time,36 er.total_elapsed_time AS ElapsedTime_ms,37 er.percent_complete ,38 er.reads,39 er.writes,40 er.logical_reads,41 wlgrp.name AS ResoursePool              ,42 SUBSTRING   (sqltxt.TEXT,(er.statement_start_offset/2) + 1,          43             ((CASE WHEN er.statement_end_offset = -1          44              THEN LEN(CONVERT(NVARCHAR(MAX), sqltxt.TEXT)) * 2          45              ELSE er.statement_end_offset          46             END - er.statement_start_offset)/2) + 1) AS [Individual Query], 47 sqltxt.TEXT AS [Batch Query]                48 FROM (SELECT session_id, SUM(wait_duration_ms) AS 49 wait_duration_ms,wait_type,blocking_session_id,COUNT(*) AS NoThread 50 FROM  SYS.DM_OS_WAITING_TASKS  GROUP BY session_id, wait_type,blocking_session_id) wt 51 INNER JOIN SYS.DM_EXEC_REQUESTS  er ON wt.session_id=er.session_id INNER JOIN SYS.DM_EXEC_SESSIONS es ON es.session_id= er.session_id52 INNER JOIN SYS.DM_RESOURCE_GOVERNOR_WORKLOAD_GROUPS wlgrp ON wlgrp.group_id=er.group_id          53 INNER JOIN  (SELECT  os.parent_node_id ,task_address FROM SYS.DM_OS_SCHEDULERS  OS INNER JOIN 54 SYS.DM_OS_WORKERS  OSW ON OS.scheduler_address=OSW.scheduler_address 55 WHERE os.status='VISIBLE ONLINE' GROUP BY os.parent_node_id ,task_address ) node   56 ON node.task_address=er.task_address57 CROSS APPLY SYS.DM_EXEC_SQL_TEXT(er.sql_handle) AS sqltxt58 WHERE sql_handle IS NOT NULL AND wt.wait_type NOT IN ('WAITFOR','BROKER_RECEIVE_WAITFOR')59 GO

輸出結果的每列說明介紹如下:

  • Node_id NUMA節點ID。可以被調度者查詢的節點映射。
  • HOST_NAME建立連接的計算機名。
  • Login_name連接到數據庫服務器的會話用戶名。
  • Program Name使用會話的對應程序名。在連接字符串里可以設置程序名。如果會話是SQL Server代理的一部分,則顯示作業名。
  • DatabaseName會話的當前數據庫名。
  • session_id會話ID。
  • blocking_session_id阻塞語句的會話ID。
  • wait_duration_ms等待時間,單位為毫秒。這個時間不包括信號等待時間(signal wait time)。
  • wait_type等待類型名稱,例如:SLEEP_TASK,CXPACKET等。
  • NoThread當前會話的線程數,如果當前會話是并行執行(parallel execution)的話。
  • command標識當前類型的命令,即T-SQL語句,例如Select,insert,update,delete等。
  • status請求狀態:Background,Running,Runnable,Sleeping 和 Suspended。
  • wait_resource請求當前等待的資源。
  • open_transaction_count 當前會話打開的事務數。
  • cpu_time請求使用的CPU時間,單位毫秒。
  • ElapsedTime_ms自請求到達后,占用的CPU時間,單位毫秒。
  • percent_complete指定操作的工作完成進度,例如備份、還原、回滾等。
  • reads請求執行的讀數。
  • writes請求執行的寫數。
  • logical_reads請求執行的邏輯讀數。
  • ResoursePool資源管理池名稱。
  • Individual Query在會話里運行的批處理SQL語句。
  • Batch Query 在會話里運行的批處理(存儲過程/一系列的語句)。

上述查詢多次執行后,輸出結果有很長wait_duration_ms的會話,這個會話不被其他會話阻塞,且一直在輸出結果里。我們就要看看這個會話的程序名,主機名,登錄用戶名,還有對應的執行語句,具體進行什么操作造成的。根據這些信息,我們可以選擇性的去終止這個會話,然后分析下具體的執行語句。如果會話是被阻塞的,我們要用另外的語句來找出阻塞的會話。

第3步,列出服務器上正運行的會話清單。

 1 /*************************************************************************************** 2 STEP 3: List the session which are currently waiting/running 3 ****************************************************************************************/ 4 SELECT node.parent_node_id AS Node_id, 5 es.HOST_NAME, 6 es.login_name, 7 CASE WHEN es.program_name LIKE '%SQLAgent - TSQL JobStep%' THEN 8 (SELECT 'SQL AGENT JOB: '+name FROM msdb..sysjobs WHERE job_id=DBO.ConvertStringToBinary (LTRIM(RTRIM((SUBSTRING(es.program_name,CHARINDEX('(job',es.program_name,0)+4,35))))) 9 )ELSE es.program_name END  AS program_name ,10 DB_NAME(er.database_id) AS DatabaseName,11 er.session_id, 12 wt.blocking_session_id,13 wt.wait_duration_ms,14 wt.wait_type,15 wt.NoThread ,16 er.command,17 er.status,18 er.wait_resource,19 er.open_transaction_count,20 er.cpu_time,21 er.total_elapsed_time AS ElapsedTime_ms,22 er.percent_complete ,23 er.reads,er.writes,er.logical_reads,24 wlgrp.name AS ResoursePool              ,25 SUBSTRING (sqltxt.TEXT,(er.statement_start_offset/2) + 1,                26 ((CASE WHEN er.statement_end_offset = -1                27 THEN LEN(CONVERT(NVARCHAR(MAX), sqltxt.TEXT)) * 2                28 ELSE er.statement_end_offset                29 END - er.statement_start_offset)/2) + 1) AS [Individual Query],30 sqltxt.TEXT AS [Batch Query]                31 FROM 32 SYS.DM_EXEC_REQUESTS  er INNER JOIN SYS.DM_EXEC_SESSIONS es ON es.session_id= er.session_id33 INNER JOIN SYS.DM_RESOURCE_GOVERNOR_WORKLOAD_GROUPS wlgrp ON wlgrp.group_id=er.group_id          34 INNER JOIN  (SELECT  os.parent_node_id ,task_address FROM SYS.DM_OS_SCHEDULERS  OS 35 INNER JOIN SYS.DM_OS_WORKERS  OSW ON OS.scheduler_address=OSW.scheduler_address36 WHERE os.status='VISIBLE ONLINE' GROUP BY os.parent_node_id ,task_address ) node ON node.task_address=er.task_address37 LEFT JOIN 38 (SELECT session_id, SUM(wait_duration_ms) AS 39 wait_duration_ms,wait_type,blocking_session_id,COUNT(*) AS NoThread 40 FROM  SYS.DM_OS_WAITING_TASKS  GROUP BY session_id, wait_type,blocking_session_id) wt 41 ON wt.session_id=er.session_id42 CROSS apply SYS.DM_EXEC_SQL_TEXT(er.sql_handle) AS sqltxt43 WHERE sql_handle IS NOT NULL AND ISNULL(wt.wait_type ,'') NOT IN 44 ('WAITFOR','BROKER_RECEIVE_WAITFOR')45 ORDER BY er.total_elapsed_time DESC46 47 GO 

這里的輸出列和第2步完全相同,我會分析total_elapsed_time占用時間較長的會話,酌情考慮是否終止這些會話,并分析下對應的執行SQL語句。大多數情況下(服務器一致運行穩定,突然卡住了),使用上述步驟就可以解決問題。下一篇文章我們會看下阻塞的會話,還有打開未活動事務的會話。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永新县| 新乡市| 昆山市| 菏泽市| 桂东县| 北票市| 巴塘县| 巢湖市| 宁陕县| 宁海县| 西华县| 惠东县| 馆陶县| 怀柔区| 南京市| 克什克腾旗| 新巴尔虎右旗| 邢台市| 孟州市| 钟祥市| 桐乡市| 衡水市| 涪陵区| 河东区| 交口县| 读书| 池州市| 兖州市| 长治县| 哈尔滨市| 巫山县| 红安县| 开封县| 黑龙江省| 潮州市| 九江县| 称多县| 汝州市| 姜堰市| 河源市| 潼南县|