Compression d'index en cluster vs compression de table - sont-ils la même chose?

8

Si je mets la compression (page ou ligne) sur l'index cluster d'une table, est-ce la même chose que la mise en compression sur la table?

SQL Server propose des options pour les deux, ce qui suggère qu'elles sont différentes, mais j'avais l'impression qu'un index cluster et une table étaient essentiellement la même chose, et mon modèle mental du fonctionnement des index cluster me dit que la compression de l'index cluster doit également compresser la table.

paulH
la source

Réponses:

11

Si je mets la compression (page ou ligne) sur l'index cluster d'une table, est-ce la même chose que la mise en compression sur la table?

Oui.

Depuis MSDN :

Utilisez la syntaxe REBUILD WITH pour reconstruire une table entière, y compris toutes les partitions d'une table partitionnée. Si la table a un index cluster, l'option REBUILD reconstruit l'index cluster.


SQL Server propose des options pour les deux, ce qui suggère qu'elles sont différentes

La raison pour laquelle les deux syntaxes existent est qu'une table n'a pas nécessairement d' index clusterisé. En d'autres termes, ALTER INDEX ALL ON ... REBUILDn'affecte pas un tas (bien qu'il touche tous les non-clusters), donc l'autre route remplit cette fonction.

En outre, alors que la documentation ne dit pas explicitement, la ALTER TABLE ... REBUILDsyntaxe ne pas activer / désactiver la compression de tous nonclustered index sur la table. Il affecte uniquement le segment de mémoire ou l'index cluster.

Enfin, si vous testez cela via SSMS, sachez que vous pouvez obtenir des erreurs lors de la désactivation de la compression - scriptez les choses afin que vous puissiez voir ce qui se passe réellement.

Jon Seigel
la source
Merci Jon, bonne explication claire! Et c'est bien d'entendre que les choses fonctionnent comme je m'y attendais (ce qui n'est certainement pas toujours le cas!)
paulH
4

L'index cluster est la table. Donc, le régler sur l'un ou l'autre est le même. Vous pouvez valider cela en comparant les deux cas ici:

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 propose également plusieurs façons de rendre une colonne unique:

CREATE TABLE dbo.foo1(bar INT UNIQUE);

...ou...

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

...ou...

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

...ou...

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

Ceux-ci se retrouveront tous avec la même implémentation sous-jacente (avec des noms différents).

Ce n'est pas parce qu'il existe différentes façons de se rendre au travail que vous ne vous retrouvez pas encore au bureau. :-)

Aaron Bertrand
la source