powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Deadlock graph shredding (скорее вопрос с XQuery и XPath)
10 сообщений из 10, страница 1 из 1
Deadlock graph shredding (скорее вопрос с XQuery и XPath)
    #39665523
x1sf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь сделать скрипт который бы парсил deadlock graph.
Возникла проблема с получением имен заблокированных ресурсов - из <process-list> получается вынуть имя ресурса только в случае блокировки ключа. Нужно получить имя заблокированного ресурса из другой части графа - <resource-list>.
Кто может помочь с постороением правильного пути для метода XQuery value?

Спасибо.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
SELECT 
	X.x.value('(../@id)','sysname') as processid,																							
	CASE 
		WHEN Deadlockgraph.value('(/TextData/deadlock-list/deadlock/@victim)[1]','sysname') = X.x.value('(../@id)','sysname') 
		THEN 1		--1 if victim process
		ELSE 0
	END AS vicid,
	Deadlockgraph.value('count(/TextData/deadlock-list/deadlock/process-list/process)', 'int') as NumOfProcInv,
	DB_NAME(X.x.value('(../@currentdb)','sysname')) as databasename,																	
	X.x.value('(../@waitresource)','sysname') as resourceid,																			
	CASE 
		WHEN X.x.value('(../@waitresource)','sysname') like 'KEY:%'
		THEN
			(SELECT CONCAT(sc.name, so.name, si.name)
			FROM sys.partitions AS p
			JOIN sys.objects as so on 
				p.object_id=so.object_id
			JOIN sys.indexes as si on 
				p.index_id=si.index_id and 
				p.object_id=si.object_id
			JOIN sys.schemas AS sc on 
				so.schema_id=sc.schema_id
			WHERE hobt_id = convert(bigint, RTRIM(SUBSTRING(X.x.value('(../@waitresource)','sysname'), CHARINDEX(':', X.x.value('(../@waitresource)','sysname'), 
			CHARINDEX(':', X.x.value('(../@waitresource)','sysname')) + 1) + 1, CHARINDEX('(', X.x.value('(../@waitresource)','sysname')) - CHARINDEX(':', X.x.value('(../@waitresource)','sysname'), 
			CHARINDEX(':', X.x.value('(../@waitresource)','sysname')) + 1) - 1))))
		ELSE
		'N/A'
	END AS resourcename,
	X.x.value('(frame/@procname)[1]','sysname') as procname,																		
	X.x.query('data(frame)') as frame,																									
	X.x.query('data(../inputbuf)') as inputnbuffer,																							 
        X.x.value('(../@lastbatchstarted)','sysname') as lastbatchstarted,
	X.x.value('(../@lastbatchcompleted)','sysname') as lastbatchcompleted,
	X.x.value('(../@hostname)','sysname') as hostname,																							
	X.x.value('(../@loginname)','sysname') as loginname,																						
	X.x.value('(../@clientapp)','sysname') as clientapp,																						
	X.x.value('(../@isolationlevel)','sysname') as isolationlevel,
	X.x.value('(../@lockMode)','sysname') as lockmode,
	X.x.value('(frame/@sqlhandle)[1]','varchar(max)') as sqlhandle,																				
	(SELECT [Text] FROM  sys.dm_exec_sql_text(CONVERT ( varbinary(64), X.x.value('(frame/@sqlhandle)[1]','varchar(max)'), 1))) as sqltext		
FROM DeadlockEvents
CROSS APPLY Deadlockgraph.nodes('/TextData/deadlock-list/deadlock/process-list/process/executionStack') AS X(x) 
ORDER BY  lastbatchstarted DESC
...
Рейтинг: 0 / 0
Deadlock graph shredding (скорее вопрос с XQuery и XPath)
    #39665603
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1sfНужно получить имя заблокированного ресурса из другой части графа - <resource-list>.Что для вас есть "имя ресурса"?
...
Рейтинг: 0 / 0
Deadlock graph shredding (скорее вопрос с XQuery и XPath)
    #39665607
x1sf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В приложенном скриншоте выдели атрибуты по которым нужно связать ноды <process list> и <resource list>.
...
Рейтинг: 0 / 0
Deadlock graph shredding (скорее вопрос с XQuery и XPath)
    #39665609
x1sf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,
Атрибут <object name> из ноды <resource list>, выше скриншот повесил.
...
Рейтинг: 0 / 0
Deadlock graph shredding (скорее вопрос с XQuery и XPath)
    #39665624
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1sf,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare @x xml = N'...';

select
 a.n.value('local-name(.)', 'nvarchar(100)'),
 a.n.value('@objectname', 'nvarchar(100)'),
 c.pid,
 d.n.query('.')
from
 @x.nodes('//resource-list/*[@objectname]') a(n) cross apply
 a.n.nodes('owner-list/owner') b(n) cross apply
 (select b.n.value('@id', 'nvarchar(100)')) c(pid) cross apply
 @x.nodes('//process[@id = sql:column("c.pid")]') d(n);

?
...
Рейтинг: 0 / 0
Deadlock graph shredding (скорее вопрос с XQuery и XPath)
    #39665628
x1sf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,
Я туплю как это можно встроить в ветвь ELSE
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CASE 
		WHEN X.x.value('(../@waitresource)','sysname') like 'KEY:%'
		THEN
			(SELECT CONCAT(sc.name, so.name, si.name)
			FROM sys.partitions AS p
			JOIN sys.objects as so on 
				p.object_id=so.object_id
			JOIN sys.indexes as si on 
				p.index_id=si.index_id and 
				p.object_id=si.object_id
			JOIN sys.schemas AS sc on 
				so.schema_id=sc.schema_id
			WHERE hobt_id = convert(bigint, RTRIM(SUBSTRING(X.x.value('(../@waitresource)','sysname'), CHARINDEX(':', X.x.value('(../@waitresource)','sysname'), 
			CHARINDEX(':', X.x.value('(../@waitresource)','sysname')) + 1) + 1, CHARINDEX('(', X.x.value('(../@waitresource)','sysname')) - CHARINDEX(':', X.x.value('(../@waitresource)','sysname'), 
			CHARINDEX(':', X.x.value('(../@waitresource)','sysname')) + 1) - 1))))
		ELSE
		'N/A'
...
Рейтинг: 0 / 0
Deadlock graph shredding (скорее вопрос с XQuery и XPath)
    #39665631
x1sf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,
Я туплю как это можно встроить в ветвь ELSE - что то в таком духе
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CASE 
		WHEN X.x.value('(../@waitresource)','sysname') like 'KEY:%'
		THEN
	
		ELSE
		select objectname
                from <resource-list>
                where id.<process list> = id.<resource list>



P.S. а сообщения тут редактировать нельзя?
...
Рейтинг: 0 / 0
Deadlock graph shredding (скорее вопрос с XQuery и XPath)
    #39665830
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1sf, к сожалению, я не нашел способа использовать XPath функцию current(), чтобы сделать такой подзапрос, поэтому единственный вариант, который вижу, это такое извращение:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
declare @graph xml = '<deadlock-list>
 <deadlock victim="process20f511868">
  <process-list>
   <process id="process20f511868" taskpriority="0" logused="0" waitresource="KEY: 5:72057598246125568 (18dfaa420d8a)" waittime="1656" ownerId="146507673519" 
transactionname="user_transaction" lasttranstarted="2018-01-21T11:15:31.693" XDES="0xc6cb93d6a8" lockMode="U" schedulerid="44" kpid="25224" status="suspended" 
spid="2118" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2018-01-21T11:15:31.693" lastbatchcompleted="2018-01-21T11:15:31.693" 
lastattention="1900-01-01T00:00:00.693" clientapp="..." hostpid="1074123192" loginname="..." isolationlevel="read committed (2)" xactid="146507673519" 
currentdb="5" lockTimeout="4294967295" clientoption1="673384544" clientoption2="128056">
    <executionStack>...
    </executionStack>
    <inputbuf>
Proc [Database Id = 5 Object Id = 1841165411]    </inputbuf>
   </process>
   <process id="process20f550cf8" taskpriority="0" logused="4736" waitresource="KEY: 5:72057598343053312 (e1a8fd993334)" waittime="1579" ownerId="146507673191" 
transactionname="user_transaction" lasttranstarted="2018-01-21T11:15:31.680" XDES="0x9cc01636a8" lockMode="U" schedulerid="52" kpid="12328" status="suspended" 
spid="983" sbid="0" ecid="0" priority="0" trancount="3" lastbatchstarted="2018-01-21T11:15:31.680" lastbatchcompleted="2018-01-21T11:15:31.680" 
lastattention="1900-01-01T00:00:00.680" clientapp="..." hostpid="1074123192" loginname="..." isolationlevel="read committed (2)" xactid="146507673191" 
currentdb="5" lockTimeout="4294967295" clientoption1="673253472" clientoption2="128056">
    <executionStack>
    ...
    </executionStack>
    <inputbuf>
Proc [Database Id = 5 Object Id = 1841165411]    </inputbuf>
   </process>
  </process-list>
  <resource-list>
   <keylock hobtid="72057598246125568" dbid="5" objectname="Table1" indexname="Index1" id="lock360fce5400" mode="X" associatedObjectId="72057598246125568">
    <owner-list>
     <owner id="process20f550cf8" mode="X"/>
    </owner-list>
    <waiter-list>
     <waiter id="process20f511868" mode="U" requestType="wait"/>
    </waiter-list>
   </keylock>
   <keylock hobtid="72057598343053312" dbid="5" objectname="Table2" indexname="Index2" id="lock36280ac900" mode="U" associatedObjectId="72057598343053312">
    <owner-list>
     <owner id="process20f511868" mode="U"/>
    </owner-list>
    <waiter-list>
     <waiter id="process20f550cf8" mode="U" requestType="wait"/>
    </waiter-list>
   </keylock>
  </resource-list>
 </deadlock>
</deadlock-list>
'

select t.processid
       , X.x.value('(keylock[owner-list/owner/@id = sql:column("processid")]/@objectname)[1]', 'sysname') as objectname
       , X.x.value('(keylock[owner-list/owner/@id = sql:column("processid")]/@indexname)[1]', 'sysname') as indexname
from 
        (
            select  X.x.value('(../@id)','sysname') as processid
            from    @graph.nodes('/deadlock-list/deadlock/process-list/process/executionStack') AS X(x) 
            ) as t
        cross apply @graph.nodes('/deadlock-list/deadlock/resource-list') AS X(x) 
...
Рейтинг: 0 / 0
Deadlock graph shredding (скорее вопрос с XQuery и XPath)
    #39665936
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Minamotoя не нашел способа использовать XPath функцию current()
И не найдете, т.к. current() - это функция XSLT, и в чистом XPath (вне XSLT) использована быть не может (т.к. выражение выбора должно быть инвариантно относительно пути обработки).
...
Рейтинг: 0 / 0
Deadlock graph shredding (скорее вопрос с XQuery и XPath)
    #39666193
x1sf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Minamoto,
получилось не очень красиво, но работает. Только procname возвращается как NULL, frame, sqlhandle просто пустые. Не понимаю как путь для них прописать.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
SELECT t.processid,t.vicid,t.NumOfProcInv,t.databasename,t.resourceid
	   ,X.x.value('(keylock[owner-list/owner/@id = sql:column("processid")]/@objectname)[1]', 'sysname') AS objectname
           ,X.x.value('(keylock[owner-list/owner/@id = sql:column("processid")]/@indexname)[1]', 'sysname') AS indexname
	   ,X.x.value('(pagelock[owner-list/owner/@id = sql:column("processid")]/@objectname)[1]', 'sysname') AS objectname1
	   ,t.procname,t.frame,t.inputnbuffer,t.spid,t.sbid,t.trancount,t.logused,t.lasttranstarted,t.lastbatchstarted
	   ,t.lastbatchcompleted,t.timet,t.hostname,t.loginname,t.clientapp,t.isolationlevel,t.lockmode,t.locktimeout
	   ,t.sqlhandle,t.sqltext
FROM
        (
        SELECT  X.x.value('(@id)','sysname') AS processid
		,CASE 
			WHEN @graph.value('(deadlock-list/deadlock/@victim)[1]','sysname') = X.x.value('(@id)','sysname') 
			THEN 1		--1 if victim process
			ELSE 0
		END AS vicid
		,@graph.value('count(/deadlock-list/deadlock/process-list/process)', 'int') as NumOfProcInv
		,DB_NAME(X.x.value('(@currentdb)','sysname')) as databasename																	
		,X.x.value('(@waitresource)','sysname') as resourceid																			
		,X.x.value('(executionstack/frame/@procname)[1]','sysname') as procname																--stored procedure name
		,X.x.query('data(/executionstack/frame)') as frame																									--T-SQL string
		,X.x.query('data(inputbuf)') as inputnbuffer																						--T-SQL string
		,X.x.value('(@spid)','sysname') as spid																							    --SQL Server session id
		,X.x.value('(@sbid)','sysname') as sbid
		,X.x.value('(@trancount)','sysname') as trancount																				
		,X.x.value('(@logused)','sysname') as logused
		,X.x.value('(@lasttranstarted)','sysname') as lasttranstarted
		,X.x.value('(@lastbatchstarted)','sysname') as lastbatchstarted
		,X.x.value('(@lastbatchcompleted)','sysname') as lastbatchcompleted
		,CASE
			WHEN X.x.value('(@lasttranstarted)','sysname') IS NULL 
			THEN DATEDIFF(MILLISECOND, X.x.value('(@lastbatchstarted)','sysname'), X.x.value('(@lastbatchcompleted)','sysname'))
			ELSE DATEDIFF(MILLISECOND, X.x.value('(@lasttranstarted)','sysname'), X.x.value('(@lastbatchcompleted)','sysname'))
		END AS timet
		,X.x.value('(@hostname)','sysname') as hostname																						    
		,X.x.value('(@loginname)','sysname') as loginname																						
		,X.x.value('(@clientapp)','sysname') as clientapp																						 
		,X.x.value('(@isolationlevel)','sysname') as isolationlevel
		,X.x.value('(@lockMode)','sysname') as lockmode
		,X.x.value('(@lockTimeout)','sysname') as locktimeout
		,X.x.value('(frame/@sqlhandle)[1]','varchar(max)') as sqlhandle																				--SQL handle
		,(SELECT [Text] FROM  sys.dm_exec_sql_text(CONVERT ( varbinary(64), X.x.value('(frame/@sqlhandle)[1]','varchar(max)'), 1))) as sqltext		--SQL query text
FROM @graph.nodes('/deadlock-list/deadlock/process-list/process') AS X(x) 
) as t
CROSS APPLY @graph.nodes('/deadlock-list/deadlock/resource-list') AS X(x)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Deadlock graph shredding (скорее вопрос с XQuery и XPath)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]