Was ist der Unterschied zwischen der Komprimierung auf der PK und der Tabelle?


9

Die Datenkomprimierung kann für die Tabelle festgelegt werden:

CREATE TABLE dbo.SomeTable(
    SomeId [bigint] NOT NULL,
    OtherId [bigint] NOT NULL,
    IsActive [bit] NOT NULL,
 CONSTRAINT [PK_Some] PRIMARY KEY CLUSTERED 
 (
    SomeId Desc
 )
) ON SomePartitionScheme(SomeId) WITH (DATA_COMPRESSION=PAGE)

Und es kann auf dem Primärschlüssel definiert werden:

CREATE TABLE dbo.SomeTable(
    SomeId [bigint] NOT NULL,
    OtherId [bigint] NOT NULL,
    IsActive [bit] NOT NULL,
 CONSTRAINT [PK_Some] PRIMARY KEY CLUSTERED 
 (
    SomeId Desc
 ) WITH (DATA_COMPRESSION=PAGE)
) ON SomePartitionScheme(SomeId) 

Aber wenn Sie es auf beide setzen, erhalten Sie diesen Fehler:

Die Option DATA_COMPRESSION wurde mehrmals für die Tabelle oder für mindestens eine ihrer Partitionen angegeben, wenn die Tabelle partitioniert ist.

Gibt es einen Unterschied zwischen dem PK und dem Tisch?


Glauben Sie, dass es einen Unterschied geben würde, wenn der Primärschlüssel nicht die gruppierte Spalte der Tabelle wäre? :)
LowlyDBA

1
@ JohnM: Ich würde es vermuten, aber ich weiß es nicht. (Deshalb
frage

Antworten:


14

Es geht nicht darum, einen Primärschlüssel zu komprimieren, sondern darum, den Clustered-Index zu komprimieren . Bei SQL Server organisiert ein Clustered-Index die physische Struktur der Tabelle für diesen Index. In kürzerer Form ist der Clustered-Index die Tabelle. Dies bedeutet, dass das Komprimieren des Clustered-Index und das Komprimieren der Tabelle funktional äquivalent sind. Wenn Sie Ihren Primärschlüssel als nicht gruppierten Index erstellen und die Basistabelle als Heap behalten würden, wären diese beiden Strukturen unterschiedlich und würden separat komprimiert.


Was wäre, wenn Sie Ihren Primärschlüssel trotz aller Rationalität zu einem nicht gruppierten Index gemacht und einen anderen gruppierten Index erstellt hätten? Wäre die Komprimierung dann wieder dieselbe?
Ross Presser

1
Es würde nicht. Denken Sie hier nicht an den Primärschlüssel, er ist irrelevant. Wir müssen uns hier auf Indizes konzentrieren, die geclustert und nicht geclustert sind. Sie können einen Clustered-Index und eine Tabelle nicht separat komprimieren, da sie dasselbe Objekt sind. Clustered-Indizes / -Tabellen und Nicht-Clustered-Indizes sind unterschiedliche Objekte und müssen einzeln komprimiert werden.
Mike Fal

Ich habe mich schlecht ausgedrückt. Ihre Antwort ist genau das, worauf ich gefahren bin - der Clustered-Index kann komprimiert werden (was auch immer indiziert wird) oder der Heap kann komprimiert werden (wenn es keinen Clustered-Index gibt), nicht beide. Ein nicht gruppierter Index kann auch separat komprimiert werden.
Ross Presser

Genau, aber um klar zu sein, können Sie keinen Heap und keinen Clustered-Index für dieselbe Tabelle haben. Es ist der eine oder andere. Aufgrund des Verhaltens von SQL Server wird häufig Primärschlüssel mit Clustered-Indizes verwechselt. Daher möchte ich sicherstellen, dass der Unterschied für diese Antwort verstanden wird.
Mike Fal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.