Quelle est la différence entre la compression sur le PK et sur la table?


9

La compression des données peut être définie sur la table:

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)

Et il peut être défini sur la clé primaire:

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) 

Mais si vous le mettez sur les deux, vous obtenez cette erreur:

L'option DATA_COMPRESSION a été spécifiée plusieurs fois pour la table, ou pour au moins une de ses partitions si la table est partitionnée.

Y a-t-il une différence à le mettre sur le PK vs sur la table?


Pensez-vous qu'il y aurait une différence si la clé primaire n'était pas la colonne en cluster de la table? :)
LowlyDBA

1
@JohnM: Je suppose que oui, mais je ne sais pas. (C'est pourquoi je demande :)
Vaccano

Réponses:


14

Il ne s'agit pas de mettre la compression sur une clé primaire, mais plutôt de mettre la compression sur l' index clusterisé . Pour SQL Server, un index cluster organise la structure physique de la table sur cet index. Ou, sous une forme plus courte, l'index cluster est la table. Cela signifie que la compression de l'index cluster et la compression de la table sont fonctionnellement équivalentes. Si vous deviez créer votre clé primaire en tant qu'index non cluster et conserver la table de base en tant que segment de mémoire, ces deux structures seraient différentes et compressées séparément.


Et si, défiant toute rationalité, vous faisiez de votre clé primaire un index non clusterisé et créiez un index cluster différent? La compression serait-elle alors à nouveau la même?
Ross Presser

1
Ce ne serait pas le cas. Ne pensez pas à la clé primaire ici, c'est sans importance. Nous devons nous concentrer ici sur les index, groupés et non groupés. Vous ne pouvez pas compresser séparément un index cluster et une table car ils sont le même objet. les index / tables en cluster et les index non-cluster sont des objets différents et doivent être compressés individuellement.
Mike Fal

Je me suis mal exprimé. Votre réponse est exactement ce à quoi je voulais en venir - l'index clusterisé peut être compressé (quoi qu'il indexe) ou le tas peut être compressé (s'il n'y a pas d'index clusterisé), pas les deux. Et un index non clusterisé peut également être compressé séparément.
Ross Presser

Exactement, mais pour être clair, vous ne pouvez pas avoir un tas et un index cluster sur la même table. C'est l'un ou l'autre. En raison du comportement de SQL Server, il est courant que les gens confondent les clés primaires avec les index clusterisés, donc je veux m'assurer que la différence est comprise pour cette réponse.
Mike Fal
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.