Soweit ich weiß, werden im Versionsspeicher nur Versionen bereinigt, die älter als die älteste aktive Transaktion sind. Frage: Ist die älteste Transaktionsdatenbank spezifisch oder behält SQL Server alle Versionen unabhängig von der Datenbank bei, wenn noch eine ältere Transaktion aktiv ist?
Hintergrundgeschichte - SQL Server 2005 SP4 Enterprise mit rund 40 Datenbanken. TempDB ist derzeit 102 GB, der Versionsspeicher ist rund 98 GB. Eine der auf der Datenbankinstanz gehosteten Anwendungen verfügt über eine offene Transaktion, die 40 Tage alt ist und auf sys.dm ... database_transactions basiert. Zwei separate große Datenbanken waren im letzten Monat extrem stark ausgelastet, und wir sahen ein konsistentes TempDB-Wachstum, das mit diesen Vorgängen zusammenfiel. Wir haben ein gewisses Wachstum erwartet. Wir haben nicht erwartet, dass es weiter wächst. Frage: Sind die im Versionsspeicher von TempDB gespeicherten Versionen dieser beiden separaten Datenbanken noch vorhanden, da eine dritte unabhängige Datenbank eine Verbindung hat, die 40 Tage alt ist und einen offenen Transaktionsstatus anzeigt?
Perfmon-Zähler: Der Versionsspeicher wächst in den wenigen Stunden, die ich heute Morgen verfolgt habe, kontinuierlich. Versionsgenerierungsrate AVG liegt bei 30 kb / s, die Versionsbereinigungsrate bei 0 kb / s.
Viel Platz für TempDB übrig, es gibt rund 300 GB Gesamtdatendateien für alle Benutzerdatenbanken. TempDB ist seit dem letzten Neustart für jede seiner 8 Datendateien um durchschnittlich 350 MB pro Tag gewachsen. Dieses Verhalten ist abnormal und die Untersuchung ergab, dass der große Versionsspeicher vorhanden ist
Antworten auf Kommentarfragen, um keinen langen Kommentarbereich zu haben:
F: Warum Auto-Wachstum auf Tempdb? A: TempDB wird auf eine Größe initialisiert, die wir für die meiste Zeit als geeignet befunden haben. Wir erlauben automatisches Wachstum, um abnormale Datenbankaktivitäten zu verarbeiten. Wir überwachen auch das automatische Wachstum.
F: Woher wissen Sie, dass die Transaktion aktiv ist und nicht nur eine aktive Verbindung? A: transaction_state sagt aktiv in sys.dm_tran_active_snapshot_database_transactions und anderen Dingen. Aktivitätsmonitor sagt, dass jede Verbindung 1 offene Transaktion hat.
F: Warum ist deine App so dumm? A: Sein Dritter. Einer von vielen in diesem Fall. Ich weiß nicht, ob das Verhalten abnormal ist oder leicht behoben werden kann.
AUFLÖSUNG
Die offenen Transaktionen, bei denen eine Bereinigung des Versionsspeichers verhindert wurde, so dass Jon Recht hatte, werden die Bereinigung des Versionsspeichers unabhängig von den Datenbanken durchgeführt. Durch das Schließen der fehlerhaften Transaktionen konnte die Bereinigung des Versionsspeichers beginnen. Die aktuelle Theorie dahinter stammt von Jon Seigel
Der Versionsspeicher kann nur Versionen löschen, die auf der ältesten aktiven Transaktion innerhalb der gesamten Instanz basieren, um die Verwendung der Snapshot-Isolation auf Transaktionsebene für mehrere Datenbanken gleichzeitig zu unterstützen.
Wenn jemand dies mit Sicherheit weiß oder beweisen kann, tun Sie dies bitte
Referenzierte Frage: Finden Sie Transaktionen, die den Versionsspeicher füllen
Referenzierte Dokumente:
TempDB 2005 WP
Teratrax-Tuning tempDB
Idera Demystify Tempdb
quelle
begin_time
Wert für die aktive Transaktion?Antworten:
(Hinweis: Dies ist keine 100% sichere Antwort, und ich habe keine Referenzen. Lassen Sie mich wissen, ob Sie das Gegenteil beweisen können.)
Der Versionsspeicher kann nur Versionen löschen, die auf der ältesten aktiven Transaktion innerhalb der gesamten Instanz basieren , um die Verwendung der Snapshot-Isolation auf Transaktionsebene für mehrere Datenbanken gleichzeitig zu unterstützen. Das würde einfach nicht funktionieren, wenn "alte" Versionen innerhalb einer Datenbank mitten in der Snapshot-Transaktion einer anderen Datenbank gelöscht würden.
Wenn es also eine sehr alte offene Transaktion gibt, kann der Versionsspeicher erst gelöscht werden, wenn diese Transaktion entweder festgeschrieben oder zurückgesetzt wird.
quelle
SQL Server stellt sicher, dass alle erforderlichen Zeilenversionen beibehalten werden.
Um diesen letzten Punkt zu erweitern, kann eine ASU nur entfernt werden, wenn:
Weitere Informationen finden Sie in den folgenden Ressourcen:
Ressourcennutzung bei der Zeilenversionierung - MSDN
Arbeiten mit Tempdb in SQL Server 2005 (Word-Dokument)
Eine Reihe von Blog-Artikeln von Sunil Argawal vom SQL Server Storage Engine-Team:
Grundlagen des
Versionsspeichers Logische Struktur des
Versionsspeichers Wachstum des Versionsspeichers und Entfernen veralteter Versionen
quelle