detail blocking query

3
-- get the info from requests including the statement  select [statement] = SUBSTRING(t.text, (r.statement_start_offset/2) + 1,  case r.statement_end_offset when -1 then datalength(t.text)  else (r.statement_end_offset - r.statement_start_offs et)/2  end), * into #row_blocked_sessions from sys.dm_exec_requests r  cross apply sys.dm_exec_sql_text(sql _handle) t  where status = 'SUSPENDED' and (wait_resource like 'KEY:%' or wait_resourc e like 'RID:%')  -- get the info on the blocked processes to build the statement  select l.request_session_id, l.resource_associated _entity_id, l.resource_descrip tion, l.resource_database_id, s.statement into #blocked_info from sys.dm_tran_locks l  join #row_blocked_sessions s on l.request_session_id = s.session_id  where l.resource_type in ('RID', 'KEY')  -- begin getting the rows for each statement:  declare crs cursor for select request_session_id, resource_associated_entity_id,  resource_description, resource_database_id, [statement] from #blocked_info  declare @request_session_id int declare @resource_associated_entity_id bigint declare @resource_description nvarchar(100) declare @resource_database_id int

Upload: hem

Post on 14-Oct-2015

2 views

Category:

Documents


0 download

DESCRIPTION

kgkhljj;pj;p

TRANSCRIPT

-- get the info from requests including the statement select [statement] = SUBSTRING(t.text, (r.statement_start_offset/2) + 1, case r.statement_end_offset when -1 then datalength(t.text) else (r.statement_end_offset - r.statement_start_offset)/2 end),*into #row_blocked_sessionsfrom sys.dm_exec_requests r cross apply sys.dm_exec_sql_text(sql_handle) t where status = 'SUSPENDED' and (wait_resource like 'KEY:%' or wait_resource like 'RID:%') -- get the info on the blocked processes to build the statement select l.request_session_id, l.resource_associated_entity_id, l.resource_description, l.resource_database_id, s.statementinto #blocked_infofrom sys.dm_tran_locks l join #row_blocked_sessions s on l.request_session_id = s.session_id where l.resource_type in ('RID', 'KEY') -- begin getting the rows for each statement: declare crs cursor for select request_session_id, resource_associated_entity_id, resource_description, resource_database_id, [statement] from #blocked_info declare @request_session_id intdeclare @resource_associated_entity_id bigintdeclare @resource_description nvarchar(100)declare @resource_database_id intdeclare @statement nvarchar(max)declare @exec nvarchar(max)declare @dbname sysnamedeclare @schema_name sysnamedeclare @object_name sysnamedeclare @index_id int open crsfetch next from crs into @request_session_id, @resource_associated_entity_id, @resource_description, @resource_database_id, @statement while @@FETCH_STATUS = 0begin -- get the database name: select @dbname = DB_NAME(@resource_database_id) select @schema_name = SCHEMA_NAME(o.schema_id), @object_name = o.name, @index_id = p.index_id from sys.partitions p join sys.objects o on o.object_id = p.object_id where p.partition_id = @resource_associated_entity_id or p.hobt_id = @resource_associated_entity_id -- print the information about the row: select @request_session_id as session_id, @resource_associated_entity_id as resource_associated_entity_id , @resource_description as resource_description, DB_NAME(@resource_database_id) as [database] , '[' + @schema_name + '].[' + @object_name + ']' as [object], @statement as [statement] -- create the statement to get the row: set @exec = N'select * from [' + @dbname + N'].[' + @schema_name + N'].[' + @object_name + N'] with (nolock, index (' + CAST (@index_id as varchar) + N')) ' + N' where %%lockres%% = ''' + @resource_description + N'''' exec sp_executesql @exec fetch next from crs into @request_session_id, @resource_associated_entity_id, @resource_description, @resource_database_id, @statement end -- clean upclose crsdeallocate crsdrop table #blocked_infodrop table #row_blocked_sessions