Dies ist eine Folgefrage zu einer Frage, die ich gestern gestellt habe: Kann ich eine Masseneinfügung in eine leere, seitenkomprimierte Tabelle vornehmen und eine vollständige Komprimierung erhalten? Die Antwort auf diese Frage (umschrieben von Randi Vertongens ausgezeichneter Antwort) lautet Ja, erfordert jedoch, dass die Masseneinfügung eine Sperre auf Tabellenebene aufweist. Andernfalls nimmt die Masseneinfügung eine Sperre auf Zeilenebene vor und führt nur eine Zeilendatenkomprimierung durch. Dies wirft die Frage auf: Wie kann ich anschließend feststellen, welche Komprimierung angewendet wird?
Gehen Sie folgendermaßen vor, um zeilenkomprimierte Daten in einer theoretisch seitenkomprimierten Tabelle zu
erstellen : 1. Erstellen Sie eine Tabelle mit DATA_COMPRESSION=PAGE
und aktivieren Sie nicht die sp_tableoption
Option "Tabellensperre beim Massenladen" für diese Tabelle.
2. Verwenden Sie bcp, um die Daten aus einer Flatfile in die neue Tabelle einzufügen, ohne jedoch die -h TABLOCK
Option zum Sperren der Tabelle anzugeben .
Das Ergebnis ist eine Tabelle, in der die Daten auf Zeilenebene komprimiert werden (kleiner als eine nicht komprimierte Tabelle, aber größer als eine seitenkomprimierte Tabelle). Wenn Sie jedoch die sys.allocation_units
Katalogtabelle überprüfen, wird die Datenkomprimierung als Seite angezeigt.
Die Frage
Wenn der Tisch Datenzuordnung für Seitenkomprimierung wie in diesem Szenario ist, was kann ich tun , wenn die , um herauszufinden , Daten in dieser Tabelle Seite komprimiert?
quelle
Antworten:
Um festzustellen, ob Datenseiten tatsächlich derzeit "PAGE" komprimiert sind, können Sie das undokumentierte DMF verwenden
sys.dm_db_database_page_allocations()
. Dasis_page_compressed
Feld enthält die gesuchten Informationen. Sie müssen denDETAILED
Modus (dh den 5. Parameter) verwenden, sonst sind alle Werte in diesem FeldNULL
.Um es klar auszudrücken (basierend auf dem Wortlaut der Frage: "Was kann ich tun, um herauszufinden, ob die Daten in dieser Tabelle seitenkomprimiert sind?"), Ist dies kein Alles-oder-Nichts-Problem: Die Seitenkomprimierung wird angewendet Pro Datenseite können Sie also keine komprimierte, komprimierte oder eine beliebige Kombination dazwischen haben. Sie müssen sich also alle Seiten ansehen. Und nein, Sie können nicht unbedingt davon ausgehen, dass eine einzelne nicht seitenkomprimierte Seite dies anzeigt,
REBUILD
da eine nicht gefüllte Seite nicht komprimiert wird.Zum Beispiel:
Das Folgende zeigt, dass die Datenseiten anfangs nicht seitenkomprimiert sind, sondern nach dem
REBUILD
Vorgang:quelle
Die Komprimierungsstufe finden Sie in der Datei sys.partitions dmv
quelle
sys.partitions
.sys.partitions
sollte der angeforderte / ideale Datenkomprimierungstyp sein. Da sich dieser Wert jedoch nur auf Partitionsebene befindet, können weder der aktuelle Wert pro Seite noch der aktuelle Wert pro Zeile angezeigt werden, die beide innerhalb jeder Partition variieren können.