snippetsqlModerate
How can I view how long a query has spent waiting for locks, without a profiler?
Viewed 0 times
canwithoutprofilerwaitingquerylongviewhasspentfor
Problem
I'm trying to diagnose a query that is intermittently taking a long time. I suspect it may be blocked trying to acquire a lock. I don't have permissions to use a profiler in the environment experiencing the issue.
Is there any way for me to obtain statistics on how long this individual query is blocked, without using an external profiler?
Is there any way for me to obtain statistics on how long this individual query is blocked, without using an external profiler?
Solution
(If you have access to DMVs then look into sp_whoisactive with
SQL server dynamic management views are your best friend :
Below are several ways to find out blocking :
A more deeper look into blocking :
```
-- Pedro Lopes (Microsoft) pedro.lopes@microsoft.com (http://blogs.msdn.com/b/blogdoezequiel/)
-- Waiter and Blocking Report
SELECT -- blocked
er.session_id AS blocked_spid
,ot.task_state AS [status]
,owt.wait_type AS blocked_spid_wait_type
,owt.wait_duration_ms AS blocked_spid_wait_time_ms
,
-- Check sys.dm_os_waiting_tasks for Exchange wait types in http://technet.microsoft.com/en-us/library/ms188743.aspx.
-- Wait Resource e_waitPipeNewRow in CXPACKET waits – Producer waiting on consumer for a packet to fill.
-- Wait Resource e_waitPipeGetRow in CXPACKET waits – Consumer waiting on producer to fill a packet.
owt.resource_description AS blocked_spid_res_desc
,CASE
WHEN owt.pageid = 1
OR owt.pageid % 8088 = 0
THEN 'Is_PFS_Page'
WHEN owt.pageid = 2
OR owt.pageid % 511232 = 0
THEN 'Is_GAM_Page'
WHEN owt.pageid = 3
OR (owt.pageid - 1) % 511232 = 0
THEN 'Is_SGAM_Page'
WHEN owt.pageid IS NULL
THEN NULL
ELSE 'Is_not_PFS_GAM_SGAM_page'
END AS blocked_spid_res_type
,(
SELECT qt.TEXT AS [text()]
FROM sys.dm_exec_sql_text(er.sql_handle) AS qt
FOR XML PATH('')
,TYPE
) AS [blocked_batch]
,es.last_request_start_time AS blocked_last_start
,LEFT(CASE COALESCE(er.transaction_isolation_level, es.transaction_isolation_level)
WHEN 0
THEN '0-Unspecified'
WHEN 1
THEN '1-ReadUncommitted(NOLOCK)'
WHEN 2
THEN '2-ReadCommitted'
WHEN 3
THEN '3-RepeatableRead'
WHEN 4
THEN '4-Serializable'
WHEN 5
THEN '5-Snapshot'
ELSE CONVERT(VARCHAR(30), er.transaction_isolation_level) + '-UNKNOWN'
END, 30) AS blocked_tran_isolation_level
,er.total_elapsed_time / 1000 AS total_elapsed_time_sec
,
-- blocker
er2.session_id AS blocker_spid
,CASE
-- blocking session is either not blocked or has open trans
WHEN owt.waiting_task_address IN (
SELECT owt2.blocking_task_address
FROM sys.dm_os_waiting_tasks owt2
)
AND (
er2.session_id IS NULL
OR owt.blocking_session_id IS NULL
OR owt.[blocking_task_address] IS NULL
)
THEN 1
ELSE 0
END AS is_head_blocker
,(
SELECT qt2.TEXT AS [text()]
FROM sys.dm_exec_sql_text(er2.sql_handle) AS qt2
FOR XML PATH('')
,TYPE
) AS [blocker_batch]
,es2.last_request_start_time AS blocker_last_start
,LEFT(CASE COALESCE(er2.transaction_isolation_level, es2.transaction_isolation_level)
WHEN 0
THEN '0-Unspecified'
WHEN 1
THEN '1-ReadUncommitted(NOLOCK)'
WHEN 2
THEN '2-ReadCommitted'
WHEN 3
THEN '3-Rep
@find_block_leaders = 1. Just tell you DBA (if you are not) to deploy it and grant you execute permission.)SQL server dynamic management views are your best friend :
Below are several ways to find out blocking :
--Ref: https://sqlserverperformance.wordpress.com/category/diagnostic-queries/
select t1.resource_type as 'lock type'
,db_name(resource_database_id) as 'database'
,t1.resource_associated_entity_id as 'blk object'
,t1.request_mode as 'lock req'
,--- lock requested
t1.request_session_id as 'waiter sid'
,t2.wait_duration_ms as 'wait time'
,-- spid of waiter
(
select [text]
from sys.dm_exec_requests as r -- get sql for waiter
cross apply sys.dm_exec_sql_text(r.sql_handle)
where r.session_id = t1.request_session_id
) as 'waiter_batch'
,(
select substring(qt.text, r.statement_start_offset / 2, (
case
when r.statement_end_offset = - 1
then LEN(CONVERT(nvarchar(max), qt.text)) * 2
else r.statement_end_offset
end - r.statement_start_offset
) / 2)
from sys.dm_exec_requests as r
cross apply sys.dm_exec_sql_text(r.sql_handle) as qt
where r.session_id = t1.request_session_id
) as 'waiter_stmt'
,-- statement blocked
t2.blocking_session_id as 'blocker sid'
,-- spid of blocker
(
select [text]
from sys.sysprocesses as p -- get sql for blocker
cross apply sys.dm_exec_sql_text(p.sql_handle)
where p.spid = t2.blocking_session_id
) as 'blocker_stmt'
from sys.dm_tran_locks as t1
inner join sys.dm_os_waiting_tasks as t2 on t1.lock_owner_address = t2.resource_address;A more deeper look into blocking :
```
-- Pedro Lopes (Microsoft) pedro.lopes@microsoft.com (http://blogs.msdn.com/b/blogdoezequiel/)
-- Waiter and Blocking Report
SELECT -- blocked
er.session_id AS blocked_spid
,ot.task_state AS [status]
,owt.wait_type AS blocked_spid_wait_type
,owt.wait_duration_ms AS blocked_spid_wait_time_ms
,
-- Check sys.dm_os_waiting_tasks for Exchange wait types in http://technet.microsoft.com/en-us/library/ms188743.aspx.
-- Wait Resource e_waitPipeNewRow in CXPACKET waits – Producer waiting on consumer for a packet to fill.
-- Wait Resource e_waitPipeGetRow in CXPACKET waits – Consumer waiting on producer to fill a packet.
owt.resource_description AS blocked_spid_res_desc
,CASE
WHEN owt.pageid = 1
OR owt.pageid % 8088 = 0
THEN 'Is_PFS_Page'
WHEN owt.pageid = 2
OR owt.pageid % 511232 = 0
THEN 'Is_GAM_Page'
WHEN owt.pageid = 3
OR (owt.pageid - 1) % 511232 = 0
THEN 'Is_SGAM_Page'
WHEN owt.pageid IS NULL
THEN NULL
ELSE 'Is_not_PFS_GAM_SGAM_page'
END AS blocked_spid_res_type
,(
SELECT qt.TEXT AS [text()]
FROM sys.dm_exec_sql_text(er.sql_handle) AS qt
FOR XML PATH('')
,TYPE
) AS [blocked_batch]
,es.last_request_start_time AS blocked_last_start
,LEFT(CASE COALESCE(er.transaction_isolation_level, es.transaction_isolation_level)
WHEN 0
THEN '0-Unspecified'
WHEN 1
THEN '1-ReadUncommitted(NOLOCK)'
WHEN 2
THEN '2-ReadCommitted'
WHEN 3
THEN '3-RepeatableRead'
WHEN 4
THEN '4-Serializable'
WHEN 5
THEN '5-Snapshot'
ELSE CONVERT(VARCHAR(30), er.transaction_isolation_level) + '-UNKNOWN'
END, 30) AS blocked_tran_isolation_level
,er.total_elapsed_time / 1000 AS total_elapsed_time_sec
,
-- blocker
er2.session_id AS blocker_spid
,CASE
-- blocking session is either not blocked or has open trans
WHEN owt.waiting_task_address IN (
SELECT owt2.blocking_task_address
FROM sys.dm_os_waiting_tasks owt2
)
AND (
er2.session_id IS NULL
OR owt.blocking_session_id IS NULL
OR owt.[blocking_task_address] IS NULL
)
THEN 1
ELSE 0
END AS is_head_blocker
,(
SELECT qt2.TEXT AS [text()]
FROM sys.dm_exec_sql_text(er2.sql_handle) AS qt2
FOR XML PATH('')
,TYPE
) AS [blocker_batch]
,es2.last_request_start_time AS blocker_last_start
,LEFT(CASE COALESCE(er2.transaction_isolation_level, es2.transaction_isolation_level)
WHEN 0
THEN '0-Unspecified'
WHEN 1
THEN '1-ReadUncommitted(NOLOCK)'
WHEN 2
THEN '2-ReadCommitted'
WHEN 3
THEN '3-Rep
Code Snippets
--Ref: https://sqlserverperformance.wordpress.com/category/diagnostic-queries/
select t1.resource_type as 'lock type'
,db_name(resource_database_id) as 'database'
,t1.resource_associated_entity_id as 'blk object'
,t1.request_mode as 'lock req'
,--- lock requested
t1.request_session_id as 'waiter sid'
,t2.wait_duration_ms as 'wait time'
,-- spid of waiter
(
select [text]
from sys.dm_exec_requests as r -- get sql for waiter
cross apply sys.dm_exec_sql_text(r.sql_handle)
where r.session_id = t1.request_session_id
) as 'waiter_batch'
,(
select substring(qt.text, r.statement_start_offset / 2, (
case
when r.statement_end_offset = - 1
then LEN(CONVERT(nvarchar(max), qt.text)) * 2
else r.statement_end_offset
end - r.statement_start_offset
) / 2)
from sys.dm_exec_requests as r
cross apply sys.dm_exec_sql_text(r.sql_handle) as qt
where r.session_id = t1.request_session_id
) as 'waiter_stmt'
,-- statement blocked
t2.blocking_session_id as 'blocker sid'
,-- spid of blocker
(
select [text]
from sys.sysprocesses as p -- get sql for blocker
cross apply sys.dm_exec_sql_text(p.sql_handle)
where p.spid = t2.blocking_session_id
) as 'blocker_stmt'
from sys.dm_tran_locks as t1
inner join sys.dm_os_waiting_tasks as t2 on t1.lock_owner_address = t2.resource_address;-- Pedro Lopes (Microsoft) pedro.lopes@microsoft.com (http://blogs.msdn.com/b/blogdoezequiel/)
-- Waiter and Blocking Report
SELECT -- blocked
er.session_id AS blocked_spid
,ot.task_state AS [status]
,owt.wait_type AS blocked_spid_wait_type
,owt.wait_duration_ms AS blocked_spid_wait_time_ms
,
-- Check sys.dm_os_waiting_tasks for Exchange wait types in http://technet.microsoft.com/en-us/library/ms188743.aspx.
-- Wait Resource e_waitPipeNewRow in CXPACKET waits – Producer waiting on consumer for a packet to fill.
-- Wait Resource e_waitPipeGetRow in CXPACKET waits – Consumer waiting on producer to fill a packet.
owt.resource_description AS blocked_spid_res_desc
,CASE
WHEN owt.pageid = 1
OR owt.pageid % 8088 = 0
THEN 'Is_PFS_Page'
WHEN owt.pageid = 2
OR owt.pageid % 511232 = 0
THEN 'Is_GAM_Page'
WHEN owt.pageid = 3
OR (owt.pageid - 1) % 511232 = 0
THEN 'Is_SGAM_Page'
WHEN owt.pageid IS NULL
THEN NULL
ELSE 'Is_not_PFS_GAM_SGAM_page'
END AS blocked_spid_res_type
,(
SELECT qt.TEXT AS [text()]
FROM sys.dm_exec_sql_text(er.sql_handle) AS qt
FOR XML PATH('')
,TYPE
) AS [blocked_batch]
,es.last_request_start_time AS blocked_last_start
,LEFT(CASE COALESCE(er.transaction_isolation_level, es.transaction_isolation_level)
WHEN 0
THEN '0-Unspecified'
WHEN 1
THEN '1-ReadUncommitted(NOLOCK)'
WHEN 2
THEN '2-ReadCommitted'
WHEN 3
THEN '3-RepeatableRead'
WHEN 4
THEN '4-Serializable'
WHEN 5
THEN '5-Snapshot'
ELSE CONVERT(VARCHAR(30), er.transaction_isolation_level) + '-UNKNOWN'
END, 30) AS blocked_tran_isolation_level
,er.total_elapsed_time / 1000 AS total_elapsed_time_sec
,
-- blocker
er2.session_id AS blocker_spid
,CASE
-- blocking session is either not blocked or has open trans
WHEN owt.waiting_task_address IN (
SELECT owt2.blocking_task_address
FROM sys.dm_os_waiting_tasks owt2
)
AND (
er2.session_id IS NULL
OR owt.blocking_session_id IS NULL
OR owt.[blocking_task_address] IS NULL
)
THEN 1
ELSE 0
END AS is_head_blocker
,(
SELECT qt2.TEXT AS [text()]
FROM sys.dm_exec_sql_text(er2.sql_handle) AS qt2
FOR XML PATH('')
,TYPE
) AS [blocker_batch]
,es2.last_request_start_time AS blocker_last_start
,LEFT(CASE COALESCE(er2.transaction_isolation_level, es2.transaction_isolation_level)
WHEN 0
THEN '0-Unspecified'
WHEN 1
THEN '1-ReadUncommitted(NOLOCK)'
WHContext
StackExchange Database Administrators Q#117599, answer score: 14
Revisions (0)
No revisions yet.