<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog de SQLpro &#187; log</title>
	<atom:link href="https://blog.developpez.com/sqlpro/ptag/log/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/sqlpro</link>
	<description>Le SQL pour SQL Server, PostGreSQL et tous les autres SGBDR</description>
	<lastBuildDate>Thu, 15 Oct 2020 12:59:17 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Extraire le code des requêtes d&#8217;un verrou mortel traqué par un graphe &#171;&#160;deadlock&#160;&#187; du profiler</title>
		<link>https://blog.developpez.com/sqlpro/p13176/ms-sql-server/extraire-le-code-des-requetes-dun-verrou-mortel-traque-par-un-graphe-deadlock-du-profiler</link>
		<comments>https://blog.developpez.com/sqlpro/p13176/ms-sql-server/extraire-le-code-des-requetes-dun-verrou-mortel-traque-par-un-graphe-deadlock-du-profiler#comments</comments>
		<pubDate>Thu, 22 Feb 2018 18:26:45 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[MS SQL Server]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[SQL Server 2012]]></category>
		<category><![CDATA[SQL Server 2014]]></category>
		<category><![CDATA[SQL Server 2016]]></category>
		<category><![CDATA[SQL Server 2017]]></category>
		<category><![CDATA[capture]]></category>
		<category><![CDATA[deadlock]]></category>
		<category><![CDATA[détection]]></category>
		<category><![CDATA[étreinte fatale]]></category>
		<category><![CDATA[interblocage]]></category>
		<category><![CDATA[lock]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[profiler]]></category>
		<category><![CDATA[SQL server]]></category>
		<category><![CDATA[trace]]></category>
		<category><![CDATA[verrou mortel]]></category>
		<category><![CDATA[victime]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/sqlpro/?p=794</guid>
		<description><![CDATA[L&#8217;outil profiler de SQL Server permet de partir à la chasse au verrous mortel et peut récupérer le graphe du verrouillage des éléments concurrents et notamment les données technique de la victime. Mais ce graphe est en fait un document XML contenant toutes les informations sur les processus en jeu, la victime et les survivants. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>L&rsquo;outil profiler de SQL Server permet de partir à la chasse au verrous mortel et peut récupérer le graphe du verrouillage des éléments concurrents et notamment les données technique de la victime. Mais ce graphe est en fait un document XML contenant toutes les informations sur les processus en jeu, la victime et les survivants. Il est alors intéressant d&rsquo;en extraire les requêtes fautives afin de corriger son code ou d&rsquo;indexer les tables, quelques un des moyens de se débarrasser des interblocages&#8230;<br />
<span id="more-794"></span><br />
Pour détecter les verrous mortels, il suffit de demander au profiler de tracer les événements de type &laquo;&nbsp;deadlock&nbsp;&raquo; de la catégorie &laquo;&nbsp;locks&nbsp;&raquo;, à savoir :</p>
<ul>
<li>Deadlock graph</li>
<li>Lock: Deadlock</li>
<li>Lock Deadlock Chain</li>
</ul>
<div id="attachment_797" style="width: 853px" class="wp-caption alignnone"><a href="http://blog.developpez.com/sqlpro/files/2018/02/Profiler-Deadlock.jpg"><img src="http://blog.developpez.com/sqlpro/files/2018/02/Profiler-Deadlock.jpg" alt="Événements à cocher pour auditer les verrous mortels de SQL Server" width="843" height="540" class="size-full wp-image-797" /></a><p class="wp-caption-text">Événements à cocher pour auditer les verrous mortels de SQL Server</p></div>
<p>Une foi enregistrés, les données du profiler peuvent être vues par le client graphique sous cette forme :<br />
<div id="attachment_798" style="width: 1930px" class="wp-caption alignnone"><a href="http://blog.developpez.com/sqlpro/files/2018/02/Profiler-SQL-Server-et-Deadlock.png"><img src="http://blog.developpez.com/sqlpro/files/2018/02/Profiler-SQL-Server-et-Deadlock.png" alt="Lecture des informations de verrous mortels dans le client graphique du profiler de SQL Server" width="1920" height="1040" class="size-full wp-image-798" /></a><p class="wp-caption-text">Lecture des informations de verrous mortels dans le client graphique du profiler de SQL Server</p></div></p>
<p>Néanmoins, il faut passer à l&rsquo;aide de sa souris sur chacune des bulles représentant les processus pour obtenir le texte des requêtes en jeu. Les rectangles visualisant les verrous, les pattes formant le graphe, qui lorsqu&rsquo;il présente un cycle contient un interblocage.</p>
<p>Dès lors, on peut récupérer les fichiers générés sous forme SQL via la fonction table sys.fn_trace_gettable dont le premier argument est le chemin de stockage des fichiers de trace du profiler et le second le numéro du fichier concerné. On peut aussi tous les obtenir en mettant le mot clef DEFAULT.<br />
L&rsquo;événement de graphe de verrouillage étant de classe 148, il suffit ensuite de filtrer sur ces lignes.<br />
Exemple :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT *<br />
FROM &nbsp; sys.fn_trace_gettable('C:\SQL_TRACE\20180219_14H30_DEADLOCK_.trc', default)</div></div>
<p>La colonne TextData de cette table virtuelle contient alors le XML donnant toutes les informations sur le verrou mortel. En voici un exemple :<br />
<div id="attachment_799" style="width: 780px" class="wp-caption alignnone"><a href="http://blog.developpez.com/sqlpro/files/2018/02/Deadlock-XML-SQL-Server.jpg"><img src="http://blog.developpez.com/sqlpro/files/2018/02/Deadlock-XML-SQL-Server.jpg" alt="Document XML montrant toutes les informations d&#039;un verrou mortel survenu dans SQL Server" width="770" height="702" class="size-full wp-image-799" /></a><p class="wp-caption-text">Document XML montrant toutes les informations d&rsquo;un verrou mortel survenu dans SQL Server</p></div></p>
<p>Avec une requête mêlant du SQL et du XML via XQuery et XPath, il est possible d&rsquo;extraire ce qui nous intéresse, à savoir, le texte des requêtes en jeu ainsi qu&rsquo;une indication disant quelle est la victime et les survivants. Et comme il n&rsquo;y a pas qu&rsquo;un seul interblocage en général, alors on les identifie par un numéro. la requête au final ressemble à cela :</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">WITH</span> <br />
TX <span style="color: #993333; font-weight: bold;">AS</span> <br />
<span style="color: #66cc66;">&#40;</span><br />
<span style="color: #993333; font-weight: bold;">SELECT</span> StartTime<span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">CAST</span><span style="color: #66cc66;">&#40;</span>TextData <span style="color: #993333; font-weight: bold;">AS</span> xml<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> TextData <br />
<span style="color: #993333; font-weight: bold;">FROM</span> &nbsp; sys<span style="color: #66cc66;">.</span>fn_trace_gettable<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'C:<span style="color: #000099; font-weight: bold;">\!</span> FB<span style="color: #000099; font-weight: bold;">\R</span>henus<span style="color: #000099; font-weight: bold;">\2</span>018-02-19<span style="color: #000099; font-weight: bold;">\2</span>0180219_14H30_DEADLOCK_.trc'</span><span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #993333; font-weight: bold;">WHERE</span> &nbsp;EventClass <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">148</span> <br />
<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
TVM <span style="color: #993333; font-weight: bold;">AS</span> <br />
<span style="color: #66cc66;">&#40;</span><br />
<span style="color: #993333; font-weight: bold;">SELECT</span> StartTime<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;v<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">VALUE</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'(./inputbuf)[1]'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'nvarchar(max)'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> Query<span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp;i<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">VALUE</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'(./deadlock/@victim)[1]'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'varchar(32)'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> ProcessVictim<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;v<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">VALUE</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'(./@id)[1]'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'varchar(32)'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> ProcessID<br />
<span style="color: #993333; font-weight: bold;">FROM</span> &nbsp;TX<br />
&nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">CROSS</span> APPLY TextData<span style="color: #66cc66;">.</span>nodes<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/deadlock-list'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> X<span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">CROSS</span> APPLY TextData<span style="color: #66cc66;">.</span>nodes<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/deadlock-list/deadlock/process-list/process'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> V<span style="color: #66cc66;">&#40;</span>v<span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
TVV <span style="color: #993333; font-weight: bold;">AS</span><br />
<span style="color: #66cc66;">&#40;</span><br />
<span style="color: #993333; font-weight: bold;">SELECT</span> DENSE_RANK<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OVER</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> StartTime<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> ID<span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp;StartTime<span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp;Query<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">CASE</span> <span style="color: #993333; font-weight: bold;">WHEN</span> ProcessVictim <span style="color: #66cc66;">=</span> ProcessID <span style="color: #993333; font-weight: bold;">THEN</span> <span style="color: #ff0000;">'Victim!'</span> <span style="color: #993333; font-weight: bold;">ELSE</span> <span style="color: #ff0000;">'Alive'</span> <span style="color: #993333; font-weight: bold;">END</span> <span style="color: #993333; font-weight: bold;">AS</span> FinalState<br />
<span style="color: #993333; font-weight: bold;">FROM</span> TVM<br />
<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
TQV <span style="color: #993333; font-weight: bold;">AS</span><br />
<span style="color: #66cc66;">&#40;</span><br />
<span style="color: #993333; font-weight: bold;">SELECT</span> ID<span style="color: #66cc66;">,</span> Query<br />
<span style="color: #993333; font-weight: bold;">FROM</span> &nbsp; TVV <br />
<span style="color: #993333; font-weight: bold;">WHERE</span> &nbsp;FinalState <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Victim!'</span><br />
<span style="color: #66cc66;">&#41;</span><br />
<span style="color: #993333; font-weight: bold;">SELECT</span> TVV<span style="color: #66cc66;">.</span>ID<span style="color: #66cc66;">,</span> TVV<span style="color: #66cc66;">.</span>StartTime<span style="color: #66cc66;">,</span> TVV<span style="color: #66cc66;">.</span>Query<span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">CASE</span> <span style="color: #993333; font-weight: bold;">WHEN</span> TQV<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">THEN</span> <span style="color: #ff0000;">'Victim!'</span> <span style="color: #993333; font-weight: bold;">ELSE</span> <span style="color: #ff0000;">'Alive'</span> <span style="color: #993333; font-weight: bold;">END</span> <span style="color: #993333; font-weight: bold;">AS</span> FinalState <br />
<span style="color: #993333; font-weight: bold;">FROM</span> &nbsp; TVV <br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">OUTER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> TQV<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">ON</span> TVV<span style="color: #66cc66;">.</span>ID <span style="color: #66cc66;">=</span> TQV<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">AND</span> TVV<span style="color: #66cc66;">.</span>Query <span style="color: #66cc66;">=</span> TQV<span style="color: #66cc66;">.</span>Query<br />
<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #cc66cc;">1</span>;</div></div>
<p>Au final une telle requête permet de présenter les informations suivantes :<br />
<div id="attachment_807" style="width: 588px" class="wp-caption alignnone"><a href="http://blog.developpez.com/sqlpro/files/2018/02/Resultat-requête-deadlock1.jpg"><img src="http://blog.developpez.com/sqlpro/files/2018/02/Resultat-requête-deadlock1.jpg" alt="Visualisation des requêtes en jeu dans un verrou mortel" width="578" height="383" class="size-full wp-image-807" /></a><p class="wp-caption-text">Visualisation des requêtes en jeu dans un verrou mortel</p></div><br />
Notez au passage le colonne &laquo;&nbsp;FinalState&nbsp;&raquo; indiquant quelle requête a été victime et celles ayant survécus.</p>
<p><a href="http://sqlpro.developpez.com/_fichierSQL/DEADLOCK-SQL.txt" title="Fichier du code" target="_blank">Le code ! Le code ! Le code ! Le code ! Le code ! Le code ! Le code ! Le code ! Le code ! Le code ! </a></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Frédéric Brouard, alias SQLpro, ARCHITECTE DE DONNÉES<br />
Expert &nbsp;S.G.B.D &nbsp;relationnelles &nbsp; et &nbsp; langage &nbsp;S.Q.L<br />
Moste &nbsp;Valuable &nbsp;Professionnal &nbsp;Microsoft &nbsp;SQL Server<br />
Société SQLspot &nbsp;: &nbsp;modélisation, conseil, formation,<br />
optimisation, &nbsp;audit, &nbsp;tuning, &nbsp;administration &nbsp;SGBDR<br />
Enseignant: CNAM PACA, ISEN Toulon, CESI Aix en Prov.</div></div>
<p>L&rsquo;entreprise <a href="http://www.sqlspot.com">SQL Spot</a><br />
<strong>Le site web sur le </strong><a href="http://sqlpro.developpez.com/">SQL et les SGBDR</a></p>
<p><img src="http://blog.developpez.com/media/Microsoft_MVP_logo_vertical Brouard 400.jpg" width="400" height="135" alt="MVP Microsoft SQL
Server" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
