Qual è la differenza tra la compressione sul PK e sul tavolo?


9

La compressione dei dati può essere impostata nella tabella:

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)

E può essere definito sulla chiave primaria:

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) 

Ma se lo metti su entrambi, ottieni questo errore:

L'opzione DATA_COMPRESSION è stata specificata più di una volta per la tabella o per almeno una delle sue partizioni se la tabella è partizionata.

C'è qualche differenza nel metterlo sul PK vs sul tavolo?


Pensi che ci sarebbe una differenza se la chiave primaria non fosse la colonna raggruppata della tabella? :)
LowlyDBA,

1
@JohnM: Immagino di si, ma non lo so. (Ecco perché te lo chiedo :)
Vaccano,

Risposte:


14

Non si tratta di mettere la compressione su una chiave primaria, ma piuttosto di mettere la compressione sull'indice cluster . Per SQL Server, un indice cluster sta organizzando la struttura fisica della tabella su quell'indice. Oppure, in forma più breve, l'indice cluster è la tabella. Ciò significa che la compressione dell'indice cluster e la compressione della tabella sono funzionalmente equivalenti. Se si dovesse creare la chiave primaria come indice non cluster e mantenere la tabella di base come un heap, queste due strutture sarebbero diverse e compresse separatamente.


E se, sfidando tutta la razionalità, rendessi la tua chiave primaria un indice non cluster e creassi un indice cluster diverso? La compressione sarebbe di nuovo la stessa?
Ross Presser,

1
Non lo farebbe. Non pensare alla chiave primaria qui, è irrilevante. Dobbiamo concentrarci sugli indici qui, raggruppati e non raggruppati. Non è possibile comprimere separatamente un indice cluster e una tabella perché sono lo stesso oggetto. indici / tabelle cluster e indici non cluster sono oggetti diversi e devono essere compressi singolarmente.
Mike Fal,

Mi sono espresso male. La tua risposta è esattamente ciò a cui stavo guidando: l'indice cluster può essere compresso (qualunque sia l'indicizzazione) o l'heap può essere compresso (se non c'è indice cluster), non entrambi. E un indice non cluster può anche essere compresso, separatamente.
Ross Presser,

Esatto, ma per essere chiari, non puoi avere un heap e un indice cluster sulla stessa tabella. È l'uno o l'altro. A causa del comportamento di SQL Server, è comune che le persone confondano le chiavi primarie con gli indici cluster, quindi voglio assicurarmi che la differenza sia compresa per questa risposta.
Mike Fal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.