Ich möchte wissen, wie man die genaue Abfrage oder den gespeicherten Prozess identifiziert, der das Transaktionsprotokoll der TEMPDB-Datenbank tatsächlich auffüllt.
65
Ich möchte wissen, wie man die genaue Abfrage oder den gespeicherten Prozess identifiziert, der das Transaktionsprotokoll der TEMPDB-Datenbank tatsächlich auffüllt.
Antworten:
Von http://www.sqlservercentral.com/scripts/tempdb/72007/
BEARBEITEN
Wie Martin in einem Kommentar ausführte, werden hier keine aktiven Transaktionen gefunden , die Speicherplatz in tempdb belegen. Es werden nur aktive Abfragen gefunden , die derzeit dort Speicherplatz belegen (und wahrscheinlich die Ursache für die aktuelle Protokollnutzung). Es könnte also eine offene Transaktion geben, aber die eigentliche Abfrage, die das Problem verursacht, wird nicht mehr ausgeführt.
Sie könnten die Änderung
inner join
auf ,sys.dm_exec_requests
um einleft outer join
, dann werden Sie Zeilen für Sitzungen zurück , die derzeit nicht aktiv Abfragen ausgeführt werden .Die Abfrage, die Martin gepostet hat ...
... würde
session_id
s mit aktiven Transaktionen identifizieren , die Protokollspeicher belegen, aber Sie wären nicht in der Lage, die tatsächliche Abfrage zu ermitteln, die das Problem verursacht hat, da sie in der obigen Abfrage für nicht erfasst wird, wenn sie jetzt nicht ausgeführt wird aktive Anfragen. Möglicherweise können Sie die aktuellste Abfrage mit reaktiv überprüfenDBCC INPUTBUFFER
, sie sagt Ihnen jedoch möglicherweise nicht, was Sie hören möchten. Sie können einen Outer Join auf ähnliche Weise ausführen, um diejenigen zu erfassen, die aktiv ausgeführt werden. Beispiel:Sie können auch die DMV verwenden
sys.dm_db_session_space_usage
, um die gesamte Speicherplatzauslastung pro Sitzung anzuzeigen (möglicherweise erhalten Sie jedoch auch hier keine gültigen Ergebnisse für die Abfrage zurück. Wenn die Abfrage nicht aktiv ist, ist das, was Sie zurückerhalten, möglicherweise nicht der eigentliche Schuldige).Mit all diesen Abfragen sollten Sie eingrenzen können, wer Tempdb verwendet und wie, insbesondere, wenn Sie sie auf frischer Tat ertappen.
Einige Tipps zur Minimierung der Tempdb-Auslastung
SORT_IN_TEMPDB
Option, wenn sie nicht benötigt wirdSie können auch bedenken, dass die Verwendung Ihres Tempdb-Protokolls durch interne Prozesse verursacht werden kann, über die Sie nur wenig oder gar keine Kontrolle haben. Beispielsweise verwenden Datenbank-E-Mails, Ereignisbenachrichtigungen, Abfragebenachrichtigungen und Service Broker Tempdb in irgendeiner Weise. Sie können die Verwendung dieser Funktionen beenden, aber wenn Sie sie verwenden, können Sie nicht vorschreiben, wie und wann sie Tempdb verwenden.
quelle
session_id
mit der folgenden Abfrage angezeigt wirdSELECT database_transaction_log_bytes_reserved,session_id FROM sys.dm_tran_database_transactions tdt JOIN sys.dm_tran_session_transactions tst ON tdt.transaction_id = tst.transaction_id WHERE database_id = 2
. Die Abfrage, die ich erwartete zu finden, war nach dem Ausführen der folgendenBEGIN TRAN CREATE TABLE #T(X CHAR(8000)) INSERT INTO #T SELECT name FROM sys.objects
@@SPID
geht<>
nicht=
.dm_db_task_space_usage
meldet0
für mich die spid mit der offenen transaktion für alle spalten. Fragen Sie sich, ob Sie es abfragen müssen, wenn die Anforderung tatsächlich ausgeführt wird, anstatt mit einer offenen Transaktion inaktiv zu sein.https://social.msdn.microsoft.com/Forums/sqlserver/en-US/17d9f862-b9ae-42de-ada0-4229f56712dc/tempdb-log-filling-cannot-find-how-or-what?forum=sqldatabaseengine
quelle
Vielen Dank für diesen Beitrag, wahrscheinlich der einzige seiner Art. Mein Test war einfach, erstelle eine temporäre Tabelle und stelle sicher, dass sie angezeigt wird, wenn ich eine der Abfragen aus diesem Beitrag ausführe ... nur ein oder zwei waren wirklich erfolgreich. Ich habe es korrigiert, um es mit T-SQL zu verbinden, es für längere Läufe optimiert und es ziemlich nützlich gemacht. Lassen Sie mich wissen, wenn ich etwas verpasst habe, Sie aber bisher ein automatisiertes Skript erhalten haben. Mithilfe der folgenden STDEV-Abfrage (Standardabweichung) können Sie beurteilen, welche Abfrage / SPID über einen bestimmten Zeitraum der Täter ist.
Dies läuft 40 Mal alle 3 Minuten, also 2 Stunden. Ändern Sie die Parameter nach Bedarf.
Darunter befindet sich ein WHERE> 50-Seiten-Filter, den die Benutzer möglicherweise löschen möchten, falls Sie viele kleine Tabellen haben. Andernfalls werden Sie diese Nuance mit dem Folgenden nicht erfassen, wie es ist ...
Genießen!
quelle
Leider kann das tempDB-Protokoll nicht direkt auf die Sitzungs-IDs zurückgeführt werden, indem laufende Prozesse angezeigt werden.
Verkleinern Sie die tempDB-Protokolldatei bis zu einem Punkt, an dem sie wieder erheblich wächst. Erstellen Sie dann ein erweitertes Ereignis, um das Protokollwachstum zu erfassen. Sobald es wieder wächst, können Sie das erweiterte Ereignis erweitern und die Paketereignisdatei anzeigen. Öffnen Sie die Datei, fügen Sie einen Zeitfilter und einen Dateitypfilter hinzu (die Ergebnisse der Datendatei sollen nicht enthalten sein), und gruppieren Sie sie dann nach Sitzungs-ID in SSMS. Dies wird Ihnen helfen, die Schuldigen zu finden, während Sie nach Sitzungs-IDs mit den meisten Gruppen-Bys suchen. Natürlich müssen Sie über einen anderen Prozess oder ein anderes Tool erfassen, was in den Sitzungs-IDs ausgeführt wird. Vielleicht weiß jemand, wie man die Abfrage aus der Spalte query_hash abruft, und ist so freundlich, die Lösung zu veröffentlichen.
Erweiterte Veranstaltungsergebnisse:
Skript zum Erstellen des erweiterten Ereignisses:
quelle