Wir haben eine SQL Server 2005-Datenbank, deren temporäre Datenbank voll geworden ist. Wenn ich in SQL Server Management Studio gehe, kann ich alle temporären Tabellen in der Tempdb sehen. Ist es möglich zu erkennen, welche Sitzung welche temporäre Tabelle enthält? Idealerweise eine Abfrage, in der temporäre Tabellen aufgelistet werden, die von jeder Sitzung verwendet werden.
Vielen Dank,
sql-server
sql-server-2005
tempdb
SQLMIKE
quelle
quelle
Antworten:
Ich habe 2007 darum gebeten, auf Connect etwas einzubauen. Dies wurde für die Veröffentlichung 2008 abgelehnt und anschließend ignoriert, bis Connect vor einigen Jahren starb. Ich habe versucht, es auf der neuen Feedback-Site für SQL Server zu finden , aber diese Suche ist ein absoluter Müllcontainer. Der Titel meiner Anfrage lautete "dmv to map temp table to session_id" - da die Suche nur ODER ausführen kann, gibt "map temp table" 118 Ergebnisseiten zurück. Google scheint zu vermuten, dass der Artikel den Schnitt nicht geschafft hat, als Connect getötet wurde .
In der Zwischenzeit sollten Sie für SQL Server 2005 und 2008 in der Lage sein, diese Informationen aus der Standardablaufverfolgung abzurufen:
Schamlos aus diesem Jonathan Kehayias Blog-Beitrag entfernt .
Um die Speicherplatznutzung zu bestimmen, können Sie dies weiter verbessern, um Daten aus Ansichten wie
sys.db_db_partition_stats
- z.Das Problem hierbei ist der Versuch, einen Tabellennamen durch Abfragetext zu korrelieren. dies einfach nicht praktikabel, da die meiste Zeit wird der Benutzer nicht noch eine Abfrage der Tabelle ausführt (nie noch etwas dagegen , die man laufen , dass erstellt / es bevölkert).
Dies gilt jedoch auch für andere Leser (oder für Sie beim Upgrade). Die Standardablaufverfolgung in 2012+ verfolgt die Erstellung temporärer Tabellenobjekte nicht mehr , wenn die Tabelle #temp ein Heap ist. Ich bin
object_id
mir nicht sicher, ob dies ein Zufall ist oder in direktem Zusammenhang mit der Tatsache steht, dass ab 2012 alle temporären Tabellen jetzt negativ sind . Sie können natürlich zu Extended Events wechseln, um diese Informationen zu sammeln und zu verfolgen, aber das ist möglicherweise eine Menge manueller Arbeit (und ich habe nur überprüft, dass dies nicht mehr in der Ablaufverfolgung verfolgt wird - Sie können es möglicherweise nicht auswählen entweder in Extended Events). Die Standardablaufverfolgung wird Nehmen Sie # temp-Tabellen auf, die mit einer PK oder einer anderen Einschränkung oder mit Einschränkungen oder Indizes erstellt wurden, die nach dem Erstellungsereignis hinzugefügt wurden. Dann müssen Sie die oben genannten zeitbasierten Einschränkungen lockern (ein Index kann viel später als 100 ms später erstellt werden Schaffung).Einige andere Antworten auf dieser Site, die nützlich sein können:
Wie kann festgestellt werden, welche Abfrage das temporäre Transaktionsprotokoll ausfüllt?
Probleme mit der TempDB-MDF-Datei nehmen ständig zu
Suchen Sie nach Transaktionen, die den Versionsspeicher füllen
Ich habe auch darüber gebloggt, mit einer benutzerdefinierten Sitzung für erweiterte Ereignisse, um diese Informationen in SQL Server 2012 und höher zu verfolgen:
Und Paul White hat über das direkte Lesen von Seiten gebloggt (nicht gerade für schwache Nerven oder in irgendeiner Weise einfach zu automatisieren):
quelle
Hier ist eine Abfrage, mit der Sie beginnen können, die gesuchten Informationen herauszufinden:
Diese Abfrage ruft nützliche Informationen für die Top-10-Aufgaben ab, z. B. zugewiesene / freigegebene Seiten, den SQL-Text der Aufgaben (falls verfügbar) usw.
Diese DMVs sind voller großartiger Informationen. Wenn Sie also mehr Daten benötigen, können Sie diese mit dem, was Sie abrufen, kombinieren. Dies sollte jedoch ein Ausgangspunkt für die Fehlerbehebung bei aktuellen Tempdb-Verbrauchsaufgaben sein.
quelle
tempdb.sys.dm_db_partition_stats
. Leider können Sie nicht wirklich sagen, welche Kopie#some_table_name
zu welchem Benutzer gehört, und Sie können auch nicht immer einen Anweisungstext abrufen, der zu einem bestimmten Zeitpunkt auf diese Tabelle verweist. Dies ist möglicherweise nicht die Abfrage, die der Benutzer gerade ausführt. Vielleicht möchten Sie dies und das sehen