Free Deadlock-Collector & -Parser, based on Extended Events session system_health / freier Deadlock-Sammler & -Parser basierend auf Erweiterten Ereignissen

 

(en)
Today I redeemed a promise made long ago: To provide the deadlock-collector framework, which I developed for use at my customers’, as a Codeplex project.

Until now I have only given it out to attendees of my SQL Server Master-Classes and a few fellow Microsoft Certified Masters. From today on it is freely available to everyone.

(de)
Heute habe ich ein Versprechen eingelöst, das ich vor langer Zeit gemacht habe: Und zwar das Framework für den Deadlock-Collector, das ich zum Einsatz bei meinen Kunden entwickelt habe, als Codeplex-Projekt bereitzustellen.

Bisher habe ich es nur an Teilnehmer meiner SQL Server Master-Classes und einige Microsoft Certified Master-Kollegen herausgegeben. Ab heute ist es für jeden frei verfügbar.

                                                                                        Deadlock-Collector_Icon.png

 

If you just want to get it real quick, here is the link to the Codeplex project where you can download the necessary objects:

>> sqldeadlockcollector.codeplex.com <<

For more information on how to set up the solution and what kind of analysis it enables read below.

Wenn Sie ihn einfach schnell haben möchten, ist hier der Link zum Codeplex-Projekt, wo Sie die nötigen Objekte herunterladen können:

>> sqldeadlockcollector.codeplex.com <<

Weitere Informationen dazu, wie man die Lösung aufstellt und welche Art von Analyse sie ermöglicht, finden Sie im Folgenden.

 

Contents

  1. Description
  2. Technical Implementation
  3. Supported SQL Server Versions & Editions
  4. Setup High-level
  5. Setup the Jobs
  6. Integration of the Reports
  7. Usage for Analysis
  8. The Reports
  9. Availability
  10. Notes & Recommendations
  11. Call to Action: Quick Poll

 Inhalte

  1. Beschreibung
  2. Technische Umsetzung
  3. Unterstützte SQL Server Versionen & Editionen
  4. Setup High-level
  5. Setup der Aufträge
  6. Integration der Berichten
  7. Nutzung zur Analyse
  8. Die Berichte
  9. Verfügbarkeit
  10. Hinweise & Empfehlungen
  11. Call to Action: Kurze Umfrage

                                                                                         Deadlock-Collector_Icon.png

 

Description

The SQL Server Deadlock-Collector collects information which can be read out from the ring buffer in the memory of the SQL Server, and stores this information in a database-table.

Aloof from the pure deadlock graph, the data is parsed, and the first 2 respective processes of the deadlock graph are contrasted in 2 columns, respectively, with information such as “process ID, SQL/procedure text, host name, application name” etc. (procedure name is only available from SQL Server 2012 onwards because of incomplete xml in the former version).

Beschreibung

Der SQL Server Deadlock-Collector sammelt Informationen, die aus dem Ring-Buffer im Speicher des SQL Server ausgelesen werden können und speichert diese Informationen in einer Datenbanktabelle.

Abseits vom reinen Deadlock-Graphen werden die Daten zerlegt und die ersten 2 jeweiligen Prozesse des Deadlock-Graphs werden in jeweils 2 Spalten gegenübergestellt, mit Informationen wie z.B. „Prozess-ID, SQL/Prozedur Text, Hostname, Anwendungsname“ etc. (Prozedur-Name ist aufgrund unvollständigem xml in der vorherigen Version erst ab SQL Server 2012 verfügbar).

 

 

This way, one obtains a tabular representation of the deadlock processes. Since there may be more than 2 involved processes, the complete graph is always also present. (red in the image below)

Auf diese Weise erhält man eine tabellarische Darstellung der Deadlock-Prozesse. Da es mehr als 2 beteiligte Prozesse geben kann, ist der komplette Graph auch immer präsent. (rot in der Abbildung unten)

 

 

With the aid of a few sample reports, administrators will obtain a quick overview on the frequency of the occurring deadlocks in the respective databases and be able to pass on the data for further analysis to the developers or external analysis even by simply providing a copy/backup of the database.

Developers will thus obtain a valuable and quickly interpretable version of the occurring deadlock combination and be able to implement prevention strategies with this information.

Mithilfe einiger Beispielberichte erhalten Administratoren eine schnelle Übersicht über die Häufigkeit der auftretenden Deadlocks in den jeweiligen Datenbanken, und können die Daten darüber sogar durch das einfache Bereitstellen einer Kopie/eines Backups der Datenbank an die Entwickler oder externe Analysten weitergeben.

Entwickler erhalten damit eine wertvolle und schnell interpretierbare Version der auftretenden Deadlock-Kombinationen, und können mit diesen Informationen Vermeidungsstrategien umsetzen.

                                                                                           Deadlock-Collector_Icon.png

 

Technical Implementation

 The complete SQL Deadlock Collector & Parser -solution consists of 3 (small) databases, a SQL Server Agent job and 3 example Reporting Services Reports for Management Studio integration.

Through the utilization of the information already existing in memory by the Extended Events system_health-session, the SQL Deadlock Collector & Parser is absolutely lightweight and has scarcely any impact on a productive system. Solely at execution time of the data collection job (which is configurable at free will, every 6-24 hours are common), minimal resources are required.

Technische Umsetzung

Die komplette SQL Deadlock Collector & Parser – Lösung besteht aus 3 (kleinen) Datenbanken, einem SQL Server Agent Auftrag und 3 Beispiel- Reporting Services Berichten Management Studio Integration.

Durch die Nutzung der durch die system_health-Extended Events Session bereits im Arbeitsspeicher existierenden Informationen ist der SQL Deadlock Collector & Parser absolut leichtgewichtig und hat kaum eine Auswirkung auf ein produktives System. Lediglich zur Ausführungszeit des Datensammlungsauftrags (der frei konfigurierbar ist, alle 6-24 Stunden sind dabei gängig) werden minimale Ressourcen erfordert.

                                                                                          Deadlock-Collector_Icon.png

 

Supported SQL Server Versions & Editions

The SQL Deadlock Collector & Parser is designed to run on all SQL Server versions and editions from SQL Server 2008 SP2 onwards.

The provided example reports for Management Studio Integration only work with Management Studio 2012 onwards. Since SSMS is available in a free Express Edition, being mostly backwards compatible to SQL Server 2008 / R2, this is a minor constraint.

Here you can get SSMS Express in Version 2014:

www.microsoft.com/en-US/download/details.aspx?id=42299

 

Unterstützte SQL Server Versionen & Editionen

Der SQL Deadlock Collector & Parser ist so ausgelegt, dass er auf allen SQL Server Versionen und Ausgaben ab SQL Server 2008 SP2 läuft.

Die bereitgestellten Beispielberichte für Management Studio Integration funktionieren nur mit Management Studio 2012 und höher. Da SSMS als kostenlose Express Edition verfügbar ist, und dabei rückwärts kompatibel mit SQL Server 2008 / R2 ist, ist dies eine geringe Einschränkung.

Hier können Sie die SSMS Express als Version 2014 erhalten:

www.microsoft.com/de-DE/download/details.aspx?id=42299

                                                                                          Deadlock-Collector_Icon.png

 

Setup High-level

The SQL Deadlock Collector & Parser is available in the form of backup files of the respective databases which are 3 in total:

  • SQL_Analysis_Data
  • SQL_Analysis_Code
  • SQL_Analysis_Reporting

As can be seen by means of the denominations, in this relatively small project, too, it is being proceeded according to proven Sarpedon Quality Lab methodology of separating data, code and reporting. Thus, updates are being facilitated. 

The 3 databases must be set up on the same server.

 Setup High-level

Der SQL Deadlock Collector & Parser ist in Form von Backup-Dateien der jeweiligen Datenbanken verfügbar, insgesamt 3:

  • SQL_Analysis_Data
  • SQL_Analysis_Code
  • SQL_Analysis_Reporting

Wie anhand der Bezeichnungen zu erkennen ist, wird auch in diesem relativ kleinen Projekt nach bewährter Sarpedon Quality Lab Methodik der Trennung von Daten, Code und Reporting vorgegangen. So werden Updates erleichtert.

Die 3 Datenbanken müssen auf demselben Server eingerichtet werden.

Setup instructions:

  1. Recover the 3 databases in the respective version (2008 or 2012) onto your Server
    1. The “2008”-Version targets all Systems from SQL Server 2008 SP2 up to SQL Server 2008 R2 SP2
    2. The “2012”-Version targets all Systems from SQL Server 2012 RTM CU3 up to SQL Server 2014 RTM CU6
    3. All databases have to reside on the same monitored SQL Server Instance. If multiple Instances are target of collection, the deadlock collector’s databases and jobs have to be installed on each single instance. Multi-Instance-collection is not implemented
  2. Set up the collection Job
  3. Add a schedule for the collection
  4. Repeat the same for the maintenance job that removes old collected deadlocks after a specified timeframe
  5. Optional: integrate sample custom reports in SSMS for Database ”SQL_Analysis_Reporting”

If multiple Instances are to be monitored, repeat each step for each instance

 Setup Anweisungen:

  1. Stellen Sie die 3 Datenbanken in der jeweiligen Version (2008 oder 2012) auf Ihrem Server wieder her
    1. Die “2008”-Version ist für alle Systeme ab SQL Server 2008 SP2 bis zum SQL Server 2008 R2 SP2 da
    2. Die “2012”-Version ist für alle Systeme ab SQL Server 2012 RTM CU3 bis zum SQL Server 2014 RTM CU6 da
    3. Alle Datenbanken müssen auf derselben überwachten SQL Server Instanz liegen. Wenn mehrere Instanzen Ziel der Datenerfassung sind, müssen die Datenbanken und Aufträge des Deadlock Collectors auf jeder einzelnen Instanz installiert werden. Multi-Instance-Collection ist nicht implementiert
  2. Richten Sie den Sammler-Auftrag ein
  3. Fügen Sie einen Zeitplan für die Datenerfassung hinzu
  4. Wiederholen Sie das gleiche für den Maintenance Job, der alte erfasste Deadlocks nach einem festgesetzten Zeitrahmen entfernt
  5. Optional: Integrieren der Beispiel-Custom Berichte in SSMS für die Datenbank ”SQL_Analysis_Reporting”

 

Wenn mehrere Instanzen überwacht werden sollen, wiederholen Sie alle Schritte je Instanz

                                                                                          Deadlock-Collector_Icon.png

 

Setup the Jobs

Subsequently, two SQL Server Agent Jobs should be installed which will be configured as follows:

Einrichten der Jobs

Danach sollten zwei SQL Server Agent Aufträge eingerichtet werden, die wie folgt konfiguriert werden:

 

1)

Name:                                         SQL_Analysis_Collect_Deadlocks

Description:                                Job that collects Deadlock-Graphs from system_health to store in SQL_Analysis_Data.

Step 1, Type T-SQL, Name:         Exec Proc Locking ins_DeadLock

Database context:       SQL_Analysis_Code

Command:                                  DECLARE @DeadlocksCollected int;

EXECUTE Locking.ins_DeadLock

    @DeadlocksCollected = @DeadlocksCollected OUTPUT;

SELECT @DeadlocksCollected AS [Number of new Deadlocks collected:];

2)

Name:                                         SQL_Analysis_Remove_Old_Deadlocks

Description:                                Job that removes collected Deadlocks older than X days from SQL_Analysis_Data

Step 1, Type T-SQL, Name:         Exec Proc Locking del_DeadLock

Database context:       SQL_Analysis_Code

Command:                                  DECLARE @DeleteOlderThanDate date, @DeadlocksRemoved int;

SET @DeleteOlderThanDate = DATEADD(dd, -60, SYSDATETIME())

SELECT @DeleteOlderThanDate AS [LatestDateToKeep:]

 

Execute Locking.del_DeadLock

                @DeleteOlderThanDateX        = @DeleteOlderThanDate

    ,   @DeadlocksRemoved         = @DeadlocksRemoved          OUTPUT;

SELECT @DeadlocksRemoved AS [Number of removed deadlocks/rows from table:];

 

Please note that the instructions in bold must be used exactly as stated above; all others are suggestions and can be changed to your according naming styles.

In addition to that, set up a time schedule (as always I recommend a dedicated but shared schedule). For instance, every 6-12 hours, depending on the number of errors in the system_health session which works in FIFO-mode.

Bitte beachten Sie, dass die fettgedruckten Anweisungen genau wie oben angegeben verwendet werden müssen; alle anderen sind Vorschläge und können Ihren Namensrichtlinien angepasst werden.

Stellen Sie zusätzlich dazu einen Zeitplan (ich empfehle wie immer einen dedizierten aber Shared Schedule). Zum Beispiel alle 6-12 Stunden, je nach Anzahl der Fehler in der system_health Session, die im FIFO-Modus arbeitet.

After installing the databases the first time, you will find a few rows of example deadlocks in the Date-Database – also accessible via the views from the Reporting-Database.
The sole purpose of those is to help understand how the SQL Deadlock Collector & Parser works.

Nachdem Sie die Datenbanken das erste Mal eingerichtet haben, werden Sie einige Zeilen an Beispiel-Deadlocks in der Data-Datenbank finden – ebenfalls erreichbar über die Sichten aus der Reporting-Datenbank.
Der alleinige Zweck dieser ist es, besser zu verstehen zu helfen, wie der SQL Deadlock Collector & Parser funktioniert.

 

 

You can delete those manually or by using the maintenance-procedure Locking.del_DeadLock as shown in the SQL Agent job-example.

Sie können diese manuell oder mithilfe der Wartungs-Prozedur Locking.del_DeadLock, wie im SQL-Agent Auftragsbeispiel gezeigt, löschen.

                                                                                          Deadlock-Collector_Icon.png

 

Integration of Reports

In SQL Server management Studio navigate to the database “SQL_Analysis_Reporting” and there in the menu go to Reports – Custom reports, to choose the 3 provided rdl-files (separate download) for integration.

Integration der Berichte

Navigieren Sie im SQL Server Management Studio zur Datenbank “SQL_Analysis_Reporting” und dort im Menü zu Berichte – Benutzerdefinierte Berichte, um die 3 bereitgestellten rdl-Dateien (gesonderter Download) zur Integration auszuwählen. 

 


 



When the warning pops up you need to say “run” in order to execute the reports.



Wenn die Warnung eingeblendet wird, müssen Sie „Ausführen“ auswählen, um die Berichte auszuführen. 



 



 



After that the 3 reports will show up in the list. For more information on Custom Reports in Management Studio read here: Custom Reports in Management Studio  



Danach werden die 3 Berichte in der Liste angezeigt. Für mehr Informationen zu benutzerdefinierten Berichten in Management Studio können Sie hier weiterlesen: Custom Reports in Management Studio  



                                                                                         Deadlock-Collector_Icon.png



Usage for Analysis


When deadlocks are collected, these can be analyzed in different ways with the help of sample views located in the database SQL_Analysis_Reporting. These range from general statistics down to detailed statements, resources and execution plans.



Verwendung zur Analyse


Wenn Deadlocks gesammelt werden, können diese auf verschiedenen Wegen mithilfe der Beispielsichten in der Datenbank SQL_Analysis_Reporting analysiert werden. Diese reichen von allgemeinen Statistiken bis zu detaillierten Statements, Ressourcen und Ausführungsplänen.



 


 


 


 



A special feature is the inclusion of the original query plans (provided that they are available in the cache at the moment of collection) of the first 2 involved processes – very handy for analysis of cause.



Ein besonderes Feature ist die Einbeziehung des originalen Ausführungsplanes (vorausgesetzt, dass diese zum Zeitpunkt der Sammlung im Cache verfügbar sind) der ersten beiden involvierten Prozesse – sehr praktisch bei der Ursachenanalyse.



 


 



A SQLHandle of 0xFF will be shown when the handle from the deadlock-graph cannot be resolved any more. This happens for trivial plans or when the plan has been evicted from cache since the deadlock occurred.


The complete deadlock graph can also be used to get a visual representation of the deadlock graph.



Ein SQLHandle von 0xFF wird angezeigt, wenn das Handle aus dem Deadlock-Graphen nicht mehr aufgelöst werden kann. Das geschieht bei trivialen Plänen oder wenn der Plan seit Auftreten des Deadlock aus dem Cache geworfen wurde.
Der komplette Deadlock-Graph kann auch verwendet werden, um eine visuelle Repräsentation des Deadlock Graphen zu erhalten.



 


 



Example of a simple deadlock with 2 processes.



 Beispiel eines einfachen Deadlocks mit 2 Prozessen.



 4_Process_Multivictim_Deadlock


 



Example of a multi-victim-deadlock with 4 processes.
Since a deadlock can involve an unforeseeable number of processes, but a database table by nature has a strict design, I not only keep the original complete deadlock graph but also extract the list of victims, processes and execution stacks into one xml-field each for simplified analysis.



Beispiel eines Multi-Victim-Deadlocks mit 4 Prozessen.
Da ein Deadlock eine unvorhersehbare Anzahl an Prozessen involvieren kann, aber eine Datenbanktabelle von Natur aus ein striktes Design hat, behalte ich nicht nur den originalen kompletten Deadlock-Graphen sondern extrahiere auch die Liste der Victims/Opfer, Prozesse und Execution Stacks in jeweils ein XML-Feld zur vereinfachten Analyse.



 


 



Clicking on the victim-list for a deadlock with 4 victims opens a new xml-window containing just the node of victims with their respective process-id for further, manual matching with the execution stack, for example



Klickt man auf die Victim-Liste eines Deadlocks mit 4 Victims öffnet sich ein neues xml-Fenster, welches nur den Knoten der Victims mit ihrer jeweiligen Prozess-ID für weiteres manuelles Verknüpfen mit zum Beispiel dem Execution Stack.



 


<victim-list>


  <victimProcess id="process2766e188" />


  <victimProcess id="process3a72ba928" />


  <victimProcess id="process27822928" />


  <victimProcess id="process293d1868" />


</victim-list>


 


                                                                                         Deadlock-Collector_Icon.png


 



The Reports


On top of the views one can implement custom reports for reoccurring analysis. 3 example reports are included in the project and can be integrated into Management Studio directly. (Version 2012 and 2014)



Die Berichte


Basierend auf den Sichten kann man nutzerdefinierte Berichte für wiederholte Analysen implementieren. 3 Beispielberichte sind in dem Projekt enthalten und können direkt in Management Studio integriert werden. (Version 2012 und 2014)



 


 


 


                                                                                          Deadlock-Collector_Icon.png


 



Availability


The SQL Deadlock Collector & Parser is available as open source project under Microsoft Public License (Ms-PL) at codeplex:


sqldeadlockcollector.codeplex.com



Verfügbarkeit


Der SQL Deadlock Collector & Parser ist als Open Source Project unter Microsoft Public License (Ms-PL) auf Codeplex verfügbar:


sqldeadlockcollector.codeplex.com



                                                                                          Deadlock-Collector_Icon.png


 



Notes & Recommendations


1) The event-time in SQL Server 2008 may strongly deviate (hours and days!) due to a mistake in the XML-code of the system_health session. Please also see the following Connect Item:



Hinweise & Empfehlungen


1) Die Event-Zeit unter SQL Server 2008 kann aufgrund eines Fehlers im XML-Code der system_health session stark abweichen (Stunden und Tage!). Siehe dazu das folgende Connect Item:



 


http://connect.microsoft.com/SQLServer/feedback/details/649362/extended-event-session-system-health-diferent-timestamp-datetime-and-datetime-on-server-getdate


 



2) In order to make sure that larger deadlock graphs are also captured, I recommend increasing the maximal memory of the system_health session as one sees fit.


3) The size of the Data-database (SQL_Analysis_Data) may greatly expand with time. Use the clean-up procedure (Locking.del_DeadLock) inside the Code-database to remove old deadlock entries.

2) Um sicherzustellen, dass auch größere Deadlock-Graphen erfasst werden, empfehle ich, den maximalen Speicher der system_health session nach eigenem Ermessen zu erhöhen.


3) Der Umfang der Data-Datenbank kann mit der Zeit stark wachsen. Verwenden Sie die Aufräum-Prozedur (Locking.del_DeadLock) in der Code-Datenbank, um alte Deadlock Einträge zu entfernen.



                                                                                          Deadlock-Collector_Icon.png


 



Call to Action: Quick Poll


I absolutely invite you to use my code free of charge and comment on any problems you may have or improvements you would like to see.


All I would love for you to do is send me a high level statistics of what kind of deadlocks you see on your systems.


Simply run the following query after you have collected new deadlocks, and send me the result, purely consisting of the Number of affected processes and number of deadlocks.



Call to Action: Kurze Umfrage


Ich lade Sie dazu ein, meinen Code kostenlos einzusetzen und Probleme, die Sie antreffen sollten zu kommentieren.


Alles, worüber ich mich freuen würde, wäre, wenn Sie mir eine allgemeine Statistik darüber zusenden, welche Art von Deadlock Sie auf Ihren Systemen sehen.


Dafür können Sie einfach, nachdem Sie neue Deadlocks gesammelt haben, die folgende Abfrage ausführen, und mir das Ergebnis zusenden, welches lediglich aus der Anzahl der betroffenen Prozesse und Anzahl Deadlocks besteht.



 


SELECT
        [AffectedProcesses]
      , COUNT(*) AS [Number of Deadlocks]
    FROM
        [SQL_Analysis_Reporting].[Locking].[v_DeadlockInfos]
    GROUP BY
        [AffectedProcesses]
    ORDER BY
        [AffectedProcesses] ASC


-->


AffectedProcesses Number of Deadlocks
----------------- -------------------
2                 3
3                 1


(2 row(s) affected)



You can use comments or also send me an Email if you have access to it. (due to spam bots I will not post it here openly though)


Thank you for all sendings!



Sie können Kommentare verwenden, oder mir eine E-Mail schicken, wenn Sie auf diese Zugriff haben (aufgrund der Spam-Bots werde ich meine Email-Adresse hier jedoch nicht öffentlich posten).


Ich bedanke mich für alle Zusendungen!



                                                                                          Deadlock-Collector_Icon.png


 



I hope you find my tool useful, and good luck with the analysis of your hopefully not too many deadlocks.



Ich hoffe, Sie können mein Tool gut verwenden und wünsche Ihnen viel Erfolg bei der Analyse Ihrer hoffentlich nicht allzu vielen Deadlocks.



 


Andreas

  • Martin Guth
    Comment from: Martin Guth
    2015-04-10 @ 16:22:27

    Hi Andreas,

    great work. I would have liked to ask my question on codeplex but discussions are offline there for the moment.
    How can I view the Deadlock Graph from column [Complete_DeadlockGraph] in Table [DeadLock] in a graphic representation. By click I just get the XML representation. ExceutionPlans are displayed graphically however.

    Thanks in advance

    Martin

  • Comment from: Andreas Wolter
    2015-04-13 @ 13:51:10

    Hi Martin,

    Glad you like it.
    In order to view the deadlock graphically, all you have to do, is to save the XML-document which gets opened in a new window after clicking the column DeadlockGraph, with the file-extendion ".xdl".
    And this xdl-file you can then open directly in Management Studio and it will display the graph graphically.

    Andreas

  • Martin Guth
    Comment from: Martin Guth
    2015-04-28 @ 13:37:33

    Hi Andreas,

    Could you help me to grasp the difference between InputBuffer and SQLText columns? My hypothesis is that Input_Buffer contains the statement which was executed while SQLText gives kind of a hint which part of code was executed at the moment the deadlock occurred. Is that correct?

    To give an example I have some entries in the DeadLock Loggingtable like this:

    SQL_Text1: CREATE TRIGGER a ON TableA AFTER INSERT,UPDATE,DELETE..
    SQL_Text2: CREATE TRIGGER b ON TableB AFTER INSERT,UPDATE,DELETE...
    InputBuffer1: INSERT INTO TableA...
    InputBuffer2: DELETE FROM TableB...

    Triggers a and b are updateing and inserting Data into TableC. Resource List shows, that processes were waiting for each other to release two different pages of TableC as the deadlock ocurred.

    Are you able to shed some light on the column names and to verify my hypothesis?
    Would it be possible to include a column documentation (e.g. via Extended Properties) in Deadlock Monitor vNext?

    Thanks in advance for your support

    Martin

    P.S.: I had an issue with unique key violation on SQL 2014 which I posted at codeplex (https://sqldeadlockcollector.codeplex.com/workitem/list/basic). Could you take a look at it?

  • Comment from: Andreas Wolter
    2015-04-28 @ 14:13:27

    Hello Martin,

    your guess is absolutely right: InputBuffer indeed is what it's called: the current buffer taken from the deadlock graph.
    SQLText is what sys.dm_exec_sql_text() returns after I provide it with the sql_handle from the deadlocks process-executionStack
    So as an example SQLText may contain the whole Procedure/Trigger-Text whereas InputBuffer contains the call including parameter values. - In case of a trigger it's the statement that lead to the trigger being executed :-)

    I just saw your comment (notifications were not set up). I will check on that as soon as I can. Normally I should have a Where-Clause to prevent double entries which otherwise would occur all the time. I must have missed something. Which version are you on btw?

    Thanks for the feedback

    Andreas

  • Martin Guth
    Comment from: Martin Guth
    2015-04-28 @ 15:13:24

    Hi Andreas,

    thanks for the insight. After a bit of poking around I have just understood the concrete deadlock realizing that deadlocks could be much more complex than just two DDL Statements conflicting in different sessions.

    Regarding my version...the problem I mentioned ocurred on Microsoft SQL Server 2014 - 12.0.2480.0 (X64) .

    Martin

  • Martin Guth
    Comment from: Martin Guth
    2015-08-06 @ 08:54:38

    Hi Andreas,

    I got quite a number (150 a day) of deadlocks collected with seemingly non sense information.
    AffectedProcesses are 5.
    SQLText_1 and _2 are NULL.
    InputBuffer_1 and _2 contains an empty string.
    For deadlock graph see the end of the message.
    Odd is with these deadlocks that the victim-list XML element is empty.
    XDL file cannot be opened in SSMS: error message is "Failed to initialize deadlock control. Key cannot be null. Parameter name:key".
    SQL Server Version is 2008 with SP4 - 10.0.6000.29
    Could this be resulting from a situation where there is not enough space in the ring buffer to store the deadlock information?

    Thanks in advance for sharing any insight

    Martin

    Here's an example of the deadlock graph xml (tags are replaced by HTML entities in order for them to be inserted in this message):
    <deadlock>
    <victim-list />
    <process-list>
    <process id="processd71500088" taskpriority="0" logused="10000" waittime="2650" schedulerid="13" kpid="928" status="suspended" spid="243" sbid="0" ecid="8" priority="0" trancount="0" lastbatchstarted="2015-08-05T08:52:09.973" lastbatchcompleted="2015-08-05T08:52:09.973" clientapp="jTDS" hostname="3CDNWEB02" hostpid="123" isolationlevel="read committed (2)" xactid="255195918" currentdb="6" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
    <executionStack>
    <frame procname="" line="1" sqlhandle="0x020000006d15c906920385a930f40a7319bee76fb1fb7f71" />
    </executionStack>
    <inputbuf />
    </process>
    <process id="processae3322c8" taskpriority="0" logused="10000" waittime="2649" schedulerid="9" kpid="5680" status="suspended" spid="243" sbid="0" ecid="5" priority="0" trancount="0" lastbatchstarted="2015-08-05T08:52:09.973" lastbatchcompleted="2015-08-05T08:52:09.973" clientapp="jTDS" hostname="3CDNWEB02" hostpid="123" isolationlevel="read committed (2)" xactid="255195918" currentdb="6" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
    <executionStack>
    <frame procname="" line="1" sqlhandle="0x020000006d15c906920385a930f40a7319bee76fb1fb7f71" />
    </executionStack>
    <inputbuf />
    </process>
    <process id="processd71501288" taskpriority="0" logused="10000" waittime="2656" schedulerid="13" kpid="5436" status="suspended" spid="243" sbid="0" ecid="6" priority="0" trancount="0" lastbatchstarted="2015-08-05T08:52:09.973" lastbatchcompleted="2015-08-05T08:52:09.973" clientapp="jTDS" hostname="3CDNWEB02" hostpid="123" isolationlevel="read committed (2)" xactid="255195918" currentdb="6" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
    <executionStack>
    <frame procname="" line="1" sqlhandle="0x020000006d15c906920385a930f40a7319bee76fb1fb7f71" />
    </executionStack>
    <inputbuf />
    </process>
    <process id="processd71501948" taskpriority="0" logused="10000" waittime="2656" schedulerid="13" kpid="4956" status="suspended" spid="243" sbid="0" ecid="5" priority="0" trancount="0" lastbatchstarted="2015-08-05T08:52:09.973" lastbatchcompleted="2015-08-05T08:52:09.973" clientapp="jTDS" hostname="3CDNWEB02" hostpid="123" isolationlevel="read committed (2)" xactid="255195918" currentdb="6" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
    <executionStack>
    <frame procname="" line="1" sqlhandle="0x020000006d15c906920385a930f40a7319bee76fb1fb7f71" />
    </executionStack>
    <inputbuf />
    </process>
    <process id="process468f4c8" taskpriority="0" logused="10000" waittime="2656" schedulerid="9" kpid="5496" status="suspended" spid="243" sbid="0" ecid="6" priority="0" trancount="0" lastbatchstarted="2015-08-05T08:52:09.973" lastbatchcompleted="2015-08-05T08:52:09.973" clientapp="jTDS" hostname="3CDNWEB02" hostpid="123" isolationlevel="read committed (2)" xactid="255195918" currentdb="6" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
    <executionStack>
    <frame procname="" line="1" sqlhandle="0x020000006d15c906920385a930f40a7319bee76fb1fb7f71" />
    </executionStack>
    <inputbuf />
    </process>
    </process-list>
    <resource-list>
    <exchangeEvent id="Pipeb96d834b0" WaitType="e_waitPipeNewRow" nodeId="67">
    <owner-list>
    <owner id="processd71501288" />
    </owner-list>
    <waiter-list>
    <waiter id="processd71500088" />
    </waiter-list>
    </exchangeEvent>
    <exchangeEvent id="Pipeb93439cb0" WaitType="e_waitPipeGetRow" nodeId="67">
    <owner-list>
    <owner id="processd71500088" />
    </owner-list>
    <waiter-list>
    <waiter id="processae3322c8" />
    </waiter-list>
    </exchangeEvent>
    <exchangeEvent id="Pipeb7cee8680" WaitType="e_waitPipeGetRow" nodeId="14">
    <owner-list>
    <owner id="processd71501948" />
    <owner id="process468f4c8" />
    </owner-list>
    <waiter-list>
    <waiter id="processd71501288" />
    </waiter-list>
    </exchangeEvent>
    <exchangeEvent id="Pipeb7cee8700" WaitType="e_waitPipeNewRow" nodeId="14">
    <owner-list>
    <owner id="processae3322c8" />
    </owner-list>
    <waiter-list>
    <waiter id="processd71501948" />
    </waiter-list>
    </exchangeEvent>
    <exchangeEvent id="Pipeb7cee8700" WaitType="e_waitPipeNewRow" nodeId="14">
    <owner-list>
    <owner id="processae3322c8" />
    </owner-list>
    <waiter-list>
    <waiter id="process468f4c8" />
    </waiter-list>
    </exchangeEvent>
    </resource-list>
    </deadlock>

  • Parse Integration Services
    Comment from: Parse Integration Services
    2015-08-25 @ 08:21:29

    Love it! hanks for the insight. After a bit of poking around I have just understood the concrete deadlock realizing that deadlocks could be much more complex than just two DDL Statements conflicting in different sessions.

  • Comment from: Andreas Wolter
    2015-10-04 @ 20:54:42

    Hello Martin
    again, sorry for the late answer - Somehow the notifications for new comments seem to not get through.
    Your deadlock graph is very interesting.
    It is not really big. That cannot be the reason. Either it fits in the buffer, or it's not there at all.
    But as I can see all the processes belong to the same SPID. This and the Wait events show that it has do do with parallelism.So basically it must have gotten killed himself.

  • Dirk Hondong
    Comment from: Dirk Hondong
    2016-04-01 @ 13:24:09

    Hi Andreas,
    1st of all thank you for sharing such a great tool. I really appreciate your work.

    I just have set up the Collector and started the collector job for the first time.
    Unfortunately I get a duplicate key error

    Msg 2601, Level 14, State 1, Procedure ins_DeadLock, Line 365
    Cannot insert duplicate key row in object 'Locking.DeadLock' with unique index 'UQNCL_DeadLock_DeadlockHash'. The duplicate key value is (0x02df629045332d56ecc2b32d746fe03d9813bbee).

    I am currently investigating what went wrong. If you need further information just let me know and I'll provide you more details.

  • Comment from: Andreas Wolter
    2016-04-01 @ 13:47:42

    Hi Dirk,
    indeed there is an issue that under circumstances the current duplicate avoidance is not sufficient. I already have a fixed version but not tested and uploaded yet. It's on my workbench for months already :-(
    I hope by May I can provide you with the code
    Sorry about the inconvenience.

  • dirkhondong
    Comment from: dirkhondong
    2016-04-05 @ 09:21:45

    Hi Andreas,

    you already got an email from me with my solution to get it up and running.
    It seems that it now works like a charm.

    To answer oyur "call to action":
    AffectedProcesses Number of Deadlocks
    2 102
    3 348
    4 106
    5 5
    7 1

Leave a comment

Your email address will not be revealed on this site.

Your URL will be displayed.
(For my next comment on this site)
(Allow users to contact me through a message form -- Your email will not be revealed!)