Clustered-Index-Komprimierung vs. Tabellenkomprimierung - sind sie dasselbe?

8

Wenn ich die Komprimierung (entweder Seite oder Zeile) für den Clustered-Index einer Tabelle festlege, entspricht dies der Einstellung der Komprimierung für die Tabelle?

SQL Server bietet Optionen für beides, was darauf hindeutet, dass sie unterschiedlich sind. Ich hatte jedoch den Eindruck, dass ein Clustered-Index und eine Tabelle im Wesentlichen dasselbe sind, und mein mentales Modell der Funktionsweise von Clustered-Indizes zeigt, dass der Clustered-Index komprimiert wird muss auch die Tabelle komprimieren.

paulH
quelle

Antworten:

11

Wenn ich die Komprimierung (entweder Seite oder Zeile) für den Clustered-Index einer Tabelle festlege, entspricht dies der Einstellung der Komprimierung für die Tabelle?

Ja.

Von MSDN :

Verwenden Sie die Syntax REBUILD WITH, um eine gesamte Tabelle einschließlich aller Partitionen in einer partitionierten Tabelle neu zu erstellen. Wenn die Tabelle einen Clustered-Index enthält, erstellt die Option REBUILD den Clustered-Index neu.


SQL Server bietet Optionen für beides, was darauf hindeutet, dass sie unterschiedlich sind

Der Grund , warum beide Syntaxen existieren, weil eine Tabelle nicht notwendigerweise haben einen gruppierten Index. Mit anderen Worten, ALTER INDEX ALL ON ... REBUILDwirkt sich nicht auf einen Heap aus (obwohl er alle Nicht-Cluster berührt), sodass die andere Route diesem Zweck dient.

Auch wenn dies in der Dokumentation nicht ausdrücklich angegeben ist, aktiviert / deaktiviert die ALTER TABLE ... REBUILDSyntax nicht die Komprimierung aller nicht gruppierten Indizes in der Tabelle. Dies betrifft nur den Heap oder den Clustered-Index.

Wenn Sie dies über SSMS testen, müssen Sie sich darüber im Klaren sein, dass beim Deaktivieren der Komprimierung möglicherweise Fehler auftreten. Schreiben Sie die Skripte aus, damit Sie sehen können, was wirklich vor sich geht.

Jon Seigel
quelle
Danke Jon, gute klare Erklärung! Und es ist gut zu hören, dass die Dinge so funktionieren, wie ich es erwartet hatte (was definitiv nicht immer der Fall ist!)
paulH
4

Der Clustered-Index ist die Tabelle. Das Einstellen ist also dasselbe. Sie können dies überprüfen, indem Sie beide Fälle hier vergleichen:

SELECT OBJECT_NAME(p.object_id),*
 FROM sys.partitions AS p
 INNER Join sys.indexes AS i 
 ON p.object_id = i.object_id 
 AND p.index_id = i.index_id
 WHERE p.data_compression > 0;

SQL Server bietet auch verschiedene Möglichkeiten, um eine Spalte eindeutig zu machen:

CREATE TABLE dbo.foo1(bar INT UNIQUE);

...oder...

CREATE TABLE dbo.foo2(bar INT, CONSTRAINT x2 UNIQUE(bar));

...oder...

CREATE TABLE dbo.foo3(bar INT);
ALTER TABLE dbo.foo3 ADD CONSTRAINT x3 UNIQUE(bar);

...oder...

CREATE TABLE dbo.foo4(bar INT);
CREATE UNIQUE INDEX x4 ON dbo.foo4(bar);

Diese werden alle mit derselben zugrunde liegenden Implementierung (mit unterschiedlichen Namen) enden.

Nur weil es verschiedene Möglichkeiten gibt, zur Arbeit zu kommen, heißt das nicht, dass Sie nicht immer noch im Büro landen. :-)

Aaron Bertrand
quelle