Compressione dell'indice cluster vs compressione tabella: sono la stessa cosa?


8

Se imposto la compressione (pagina o riga) sull'indice cluster di una tabella, è uguale all'impostazione della compressione sulla tabella?

SQL Server offre opzioni per fare entrambe le cose, il che suggerisce che sono diverse, ma avevo l'impressione che un indice cluster e una tabella fossero essenzialmente la stessa cosa, e il mio modello mentale di funzionamento degli indici cluster mi dice che comprimere l'indice cluster deve anche comprimere la tabella.

Risposte:


11

Se imposto la compressione (pagina o riga) sull'indice cluster di una tabella, è uguale all'impostazione della compressione sulla tabella?

Sì.

Da MSDN :

Utilizzare la sintassi REBUILD WITH per ricostruire un'intera tabella incluse tutte le partizioni in una tabella partizionata. Se la tabella ha un indice cluster, l'opzione REBUILD ricostruisce l'indice cluster.


SQL Server offre opzioni per fare entrambe le cose, il che suggerisce che sono diverse

Il motivo per cui esistono entrambe le sintassi è perché un tavolo non necessariamente ha un indice cluster. In altre parole, ALTER INDEX ALL ON ... REBUILDnon influisce su un heap (sebbene toccherà tutti i non cluster), quindi l'altro percorso serve a tale scopo.

Inoltre, sebbene la documentazione non lo dica esplicitamente, la ALTER TABLE ... REBUILDsintassi non abilita / disabilita la compressione di tutti gli indici non cluster sulla tabella. Interessa solo l'heap o l'indice cluster.

Infine, se lo stai testando tramite SSMS, tieni presente che potresti disabilitare gli errori quando disabiliti la compressione: esegui lo script delle cose in modo da poter vedere cosa sta realmente succedendo.


Grazie Jon, buona spiegazione chiara! Ed è bello sapere che le cose funzionano come mi aspettavo (il che non è assolutamente il caso!)
paul

4

L'indice cluster è la tabella. Quindi, impostarlo su entrambi è lo stesso. Puoi validarlo confrontando entrambi i casi qui:

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 offre inoltre diversi modi per rendere unica una colonna:

CREATE TABLE dbo.foo1(bar INT UNIQUE);

...o...

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

...o...

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

...o...

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

Questi finiranno tutti con la stessa implementazione sottostante (con nomi diversi).

Solo perché ci sono diversi modi per andare al lavoro non significa che non si finisce ancora in ufficio. :-)

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.