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.