Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-TempDB-Überwachung mithilfe dynamischer Verwaltungsansichten (DMV)

Was ist TempDB in MS SQL Server?

TempDB ist eine Systemdatenbank in Microsoft SQL Server, die als Speicher für interne Objekte, Zeilenversionen, Arbeitstabellen, temporäre Tabellen und Indizes verwendet wird. TempDB steht allen Teilnehmern zur Verfügung, die mit einer SQL Server-Instanz verbunden sind (es handelt sich um eine globale Ressource). Für diejenigen, die mit anderen Datenbankvarianten vertraut sind, ähnelt die tempDB-Datenbank dem TEMP-Tablespace in Oracle. Um es milde auszudrücken, alles, was nicht in Ihren Instanzspeicher passt, wird in die tempdb-Datendateien übertragen.

TempDB wird typischerweise in den folgenden Fällen verwendet:

  1. Temporäre Tabellen werden mit der #-Namenskonvention erstellt. Ich habe in meinem Shop ein oder zwei Anwendungen gesehen, die eine ganze Menge dieser Konventionen erstellen. Infolgedessen kann die Leistung beeinträchtigt werden. Für jede temporäre Tabelle verteilt TempDB Seiten, deren Größe von der Tabellengröße abhängt. Darüber hinaus kann es zu Konflikten kommen, wenn mehrere gleichzeitige Sitzungen gleichzeitig solche TempTables erstellen.
  2. Die Isolationsstufe READ_COMMITTED_SNAPSHOT ist aktiviert. Wir mussten dies vor einigen Jahren bei zwei unserer Instanzen tun, weil es zwei Anwendungen gab, bei denen eine erhebliche Anzahl von Deadlocks auftrat. Die Verwendung der Snapshot-Isolationsstufen ist eine Möglichkeit, mit Deadlocks umzugehen, insbesondere wenn Sie nicht mit Entwicklern über die richtige Codierung hin und her gehen möchten. Sie sollten sich darüber im Klaren sein, dass dies zur Verbesserung der Leistung beitragen soll. Es verwendet jedoch eine optimistische Nebenläufigkeitskontrolle, die im Hinblick auf die Datenintegrität möglicherweise nicht in allen Fällen wünschenswert ist.
  3. Indizes werden mit der Option SORT_IN_TEMPDB=ON erstellt oder neu erstellt. Es neigt dazu, die Last des Sortierens aus der Datenbank zu entfernen, die den Index besitzt, während der Wiederherstellungsprozess im Gange ist. Es kann hilfreich sein, die Gesamtauswirkung dieser Option auf die Instanzleistung als Ganzes zu untersuchen.
  4. Die Funktion Multiple Active Results Sets (MARS) ist aktiviert. Nein, MARS ist in diesem Szenario kein Planet, sondern eine Funktion, die es einer Anwendung ermöglicht, mehrere Batches über eine einzige Verbindung zu übermitteln. Es ist standardmäßig deaktiviert und kann explizit aktiviert werden, indem MultipleActiveResultSets=True eingeschlossen wird in eine Verbindungszeichenfolge.
  5. Intern verwendete SQL Server auch TempDB, um Arbeitstabellen zu erstellen, die häufig in Cursoroperationen verwendet werden – Aufrufe durch die Klauseln GROUP BY, ORDER BY oder UNION. Arbeitstabellen können als temporäre Tabellen betrachtet werden, die von der SQL Server-Engine-Aktivität und nicht direkt von einer Benutzeraktivität erstellt werden.

Relevante dynamische Verwaltungsansichten SQL Server

Die folgenden relevanten dynamischen Verwaltungsansichten (DMVs) sind bei der Untersuchung der Aktivität in TempDB hilfreich:

  1. sys.dm_db_file_space_usage :Diese DMV gibt einige Informationen über die Speicherplatznutzung von Dateien in den Datenbanken zurück, an denen Sie interessiert sind. Sie kann verwendet werden, um jede Datenbank in der Instanz zu untersuchen, und die Ausgabe bezieht sich nur auf diese Datenbank. Im Kontext dieses Artikels werden wir die DMV verwenden, um TempDB zu untersuchen.
  2. sys.dm_db_session_space_usage :Diese DMV ist exklusiv für die TempDB-Datenbank und gibt die Anzahl der Seiten zurück, die von jeder Sitzung für eine bestimmte Datenbank zugewiesen und freigegeben wurden. Die Seitenzuweisungen werden normalerweise beibehalten, bis die Sitzung beendet wird.
  3. sys.dm_db_task_space_usage :Diese DMV ist ebenfalls exklusiv für die TempDB-Datenbank und bietet einige Informationen über die Anzahl der Seiten, die von jeder Aufgabe für eine bestimmte Datenbank zugewiesen und freigegeben werden.
  4. sys.dm_tran_active_snapshot_database_transactions :Diese DMV gibt die aktiven Transaktionen zurück, die Zeilenversionen generieren und möglicherweise darauf zugreifen. Diese Ansicht ist relevant, wenn Optionen wie ALLOW_SNAPSHOT_ISOLATION und READ_COMMITTED_SNAPSHOT aktiviert sind.
  5. sys.dm_tran_version_store :Diese DMV enthält einige Informationen zu allen Versionsdatensätzen im Versionsspeicher. Auf einem aktiven Produktionsserver könnten die Datensätze in dieser Tabelle erheblich anwachsen. Daher müssen wir beim Abfragen des DMV vorsichtig sein.

Untersuchen der DMV-Befehle vor dem Arbeiten mit der TempDB-Datenbank

sys.dm_file_space_usage

Einige Beschreibungen dieser DMVs können wir der Microsoft-Dokumentation entnehmen.

Tabelle 1 zeigt die Beschreibung von sys.dm_file_space_usage . Die Abfrage in Listing 1 zeigt die Dateispeichernutzung für TempDB bzw. die WideWorldImporters-Datenbanken an. Bilder 1 und 2 geben die Ausgaben dieser Abfrage mit den Datenbanken TempDB bzw. WideWorldImporters zurück.

[Tabellen-ID=44 /]

Tabelle 1:Beschreibung von sys.dm_file_space_usage

-- List 1: Check space usage on database files
-- Check space usage on tempdb
use tempdb
go
select db_name(database_id) [Database_name]
,file_name(file_id) [File_name]
,filegroup_id
,total_page_count [TPC]
,total_page_count*8/1024 [TSU (MB)]
,allocated_extent_page_count [AEPC]
,allocated_extent_page_count*8/1024 [AEPC (MB)]
,version_store_reserved_page_count [VSRP]
,version_store_reserved_page_count*8/1024 [VSRP (MB)]
,user_object_reserved_page_count [UORP]
,user_object_reserved_page_count*8/1024 [UORPC (MB)]
,internal_object_reserved_page_count [IORPC]
,internal_object_reserved_page_count*8/1024 [UORPC (MB)]
,mixed_extent_page_count [MEPC]
,mixed_extent_page_count*8/1024 [MEPC (MB)]
from sys.dm_db_file_space_usage;
-- Check space usage on WideWorldImporters
use WideWorldImporters
go
select db_name(database_id) [Database_name]
,file_name(file_id) [File_name]
,filegroup_id
,total_page_count [TPC]
,total_page_count*8/1024 [TSU (MB)]
,allocated_extent_page_count [AEPC]
,allocated_extent_page_count*8/1024 [AEPC (MB)]
,version_store_reserved_page_count [VSRP]
,version_store_reserved_page_count*8/1024 [VSRP (MB)]
,user_object_reserved_page_count [UORP]
,user_object_reserved_page_count*8/1024 [UORPC (MB)]
,internal_object_reserved_page_count [IORPC]
,internal_object_reserved_page_count*8/1024 [UORPC (MB)]
,mixed_extent_page_count [MEPC]
,mixed_extent_page_count*8/1024 [MEPC (MB)]
from sys.dm_db_file_space_usage;

Abb. 2 Ausgabe der Abfrage auf sys.dm_file_space_usage (WideWorldImporters)

Beachten Sie, dass die Spalte total_page_count die genaue Größe der betreffenden Datenbankdatei anzeigt. Außerdem werden die Dateitypen LOG und FILESTREAM nicht angezeigt. Außerdem, wie erwartet, allocated_extent_page_count entspricht dem belegten Platz in der Datendatei WWI_UserData.

Abb. 3 Dateigrößen in der WideWorldImporters-Datenbank

sys.dm_db_session_space_usage

Tabelle 2 zeigt die Nutzung der DMV sys.dm_db_session_space_usage. Listing 2 ist die Ausgabe der Abfrage. Beachten Sie, dass die Anzahl der zurückgegebenen Zeilen mit der aktuellen Anzahl der Sitzungen (aktiv oder inaktiv) in der Instanz übereinstimmt. Denken Sie auch daran, dass sich diese DMV NUR auf TempDB bezieht.

[Tabellen-ID=45 /]

Tabelle 2:Beschreibung von sys.dm_db_session_space_usage

-- Listing 2: Check space allocation per session in the instance
-- Applies on to tempdb database
select
session_id
,db_name(database_id) [Database_name]
,user_objects_alloc_page_count [UOAPC]
,user_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,user_objects_dealloc_page_count [UODPC]
,user_objects_dealloc_page_count*8/1024 [UODPC (MB)]
,internal_objects_alloc_page_count [UOAPC]
,internal_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,internal_objects_dealloc_page_count [UODPC]
,internal_objects_dealloc_page_count*8/1024 [UODPC (MB)]
from sys.dm_db_session_space_usage;
select count(*) from sys.dm_exec_sessions;

sys.dm_db_task_space_usage

Tabelle 3 zeigt die Implementierung der DMV sys.dm_db_task_space_usage. Listing 3 zeigt seine Ausgabe.

[Tabellen-ID=46 /]

Tabelle 3:Beschreibung von sys.dm_db_task_space_usage

-- List 3: Check space allocation per task int the instance
-- Applies on to tempdb database
select
task_address
,is_remote_task
,session_id
,request_id
,exec_context_id
,db_name(database_id) [Database_name]
,user_objects_alloc_page_count [UOAPC]
,user_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,user_objects_dealloc_page_count [UODPC]
,user_objects_dealloc_page_count*8/1024 [UODPC (MB)]
,internal_objects_alloc_page_count [UOAPC]
,internal_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,internal_objects_dealloc_page_count [UODPC]
,internal_objects_dealloc_page_count*8/1024 [UODPC (MB)]
from sys.dm_db_task_space_usage;

Andere DMV-Abfragen in MSSQL TempDB

Die anderen beiden DMVs scheinen leer zu sein, bevor eine Datenbankaktivität ausgeführt wird. Die Tabellen 4 und 5 zeigen eine Beschreibung beider Tabellen. Im nächsten Abschnitt sehen wir uns an, wie sich Daten in den DMVs ändern, wenn wir Datenbankaktivitäten generieren.

[Tabellen-ID=47 /]

Tabelle 4:Beschreibung von sys.dm_tran_active_snapshot_database_transactions

[Tabellen-ID=48 /]

Tabelle 5:Beschreibung von sys.dm_tran_version_store

Untersuchen der DMV nach Abschluss der Datenbankaktivität

Lassen Sie uns etwas Aktivität erzeugen.

Führen Sie dazu die einfachen Abfragen in Listing 4 aus.

-- Listing 4
-- Query 1
use WideWorldImporters
go
select * from
[Sales].[Invoices];
-- Query 2
use WideWorldImporters
go
select * from
[Sales].[Invoices]
order by ContactPersonID;

Wie Sie sehen können, gibt es bei dieser kleinen Abfrage keine signifikanten Zuweisungen oder Freigaben, also legen wir die Messlatte höher, indem wir mit dem Skript in Listing 5 eine temporäre Tabelle erstellen.

-- Listing 5
use WideWorldImporters
go
select *
into [#Invoices]
from [Sales].[Invoices];
use tempdb
go
drop table [#Invoices];

Wir bekommen jetzt eine beträchtliche Anzahl von Seiten zugewiesen und für unsere aktive Sitzung 62 reserviert (siehe Fig. 8). Achten Sie auch auf die beträchtliche Anzahl zugewiesener Extents und reservierter Seiten, die in sys.dm_db_file_space_usage (Abb. 9) angezeigt werden.

Wenn wir fortfahren und die Temptable #Invoice löschen, sehen wir, dass die in TempDB zugewiesenen Seiten freigegeben werden, wie in Abb. 12 gezeigt. Die Ausgabe der DMV dm_db_session_space_usage zeigt jedoch immer noch an, dass einige Seiten der Sitzung zugewiesen sind. Wir sehen, dass dies freigegeben wird, sobald wir die Sitzung schließen (Sitzungs-ID 62).

Als nächstes öffnen wir eine weitere Sitzung und erstellen einen Index mit den Abfragen in Listing 6. In Abfrage 1 ohne die Option SORT_IN_TEMPDB und in Abfrage 2 verwenden wir diese Option, nachdem wir den Index gelöscht haben. Für den ersten Fall finden keine signifikanten Zuweisungen statt, aber wir sehen einige Änderungen bei der Verwendung von SORT_IN_TEMPDB. Diese Änderung ist angesichts der Größe des betreffenden Index sehr gering (siehe Abb. 16 und 17).

Wir führen den Endtest durch. Wir haben herausgefunden, dass bis zu diesem Moment die DMVs wie sys.dm_tran_active_snapshot_database_transactions und sys.dm_tran_version_store keine Zeilen zurückgeben, wenn sie abgefragt werden.

Lassen Sie uns die Isolationsstufen SNAPSHOT_ISOLATION und READ_COMMITTED_SNAPSHOT aktivieren (Listing 7). Sobald dies erledigt ist, erstellt eine einzelne Update-Anweisung einen Datensatz in der DMV sys.dm_tran_version_store. Das Stellen derselben Abfrage ist eine Transaktion, die wir verwenden, um zu sehen, dass während der Transaktion auch ein Datensatz in sys.dm_tran_active_snapshot_database_transactions generiert wird.

-- Listing 7
ALTER DATABASE WideWorldImporters
SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER DATABASE WideWorldImporters
SET READ_COMMITTED_SNAPSHOT ON;
-- Listing 8
-- Query 1
 update [WideWorldImporters].[Sales].[Invoices]
 set DeliveryInstructions='Shop 50, 1476 Poddar Lane'
 where InvoiceID=48;
-- Query 2
-- Transaction
BEGIN TRAN
 update [WideWorldImporters].[Sales].[Invoices]
 set DeliveryInstructions='Shop 50, 1476 Poddar Lane'
 where InvoiceID=48;
 WAITFOR DELAY '00:00:30';
COMMIT TRAN;
GO

Schlussfolgerung

Wir haben kurz untersucht, dass wir die TempDB-Aktivität mithilfe von fünf Schlüssel-DMVs überwachen können, die von SQL Server bereitgestellt werden. Wenn wir diese Ebene des Überwachungsprozesses in einer Produktionsumgebung verwenden, können wir feststellen, ob wir mehr Speicherplatz in TempDB und Datendateien benötigen. Außerdem können wir die Auswirkungen der SNAPSHOT-Isolierung analysieren, wenn wir diese Funktion zuvor aktiviert haben.

Die Ausgabedaten dieser DMVs könnten auch hilfreich sein, um Anwendungsentwicklern die Auswirkungen ihres Codeverhaltens auf tempDB und die Instanz als Ganzes klar aufzuzeigen. Insgesamt ist es sehr lohnend, die Verwendung dieser DMVs als DBA zu verstehen, der sich mit Leistungs- und Speicherplatzverwaltung befasst.

Referenzen

Snapshot-Isolation in SQL Server
Verwenden mehrerer aktiver Ergebnissätze
Beschreibung von sys.dm_tran_version_store
Beschreibung von sys.dm_db_task_space_usage
Beschreibung von sys.dm_file_space_usage
Beschreibung von sys.dm_db_session_space_usage
Beschreibung von sys.dm_tran_active_snapshot_database_transactions