Compresión de índice agrupado frente a compresión de tabla: ¿son lo mismo?

8

Si configuro la compresión (página o fila) en el índice agrupado de una tabla, ¿es lo mismo que configurar la compresión en la tabla?

SQL Server proporciona opciones para hacer ambas cosas, lo que sugiere que son diferentes, pero tenía la impresión de que un índice agrupado y una tabla eran esencialmente lo mismo, y mi modelo mental de cómo funcionan los índices agrupados me dice que comprimir el índice agrupado También debe comprimir la mesa.

PaulH
fuente

Respuestas:

11

Si configuro la compresión (página o fila) en el índice agrupado de una tabla, ¿es lo mismo que configurar la compresión en la tabla?

Si.

De MSDN :

Utilice la sintaxis REBUILD WITH para reconstruir una tabla completa, incluidas todas las particiones en una tabla particionada. Si la tabla tiene un índice agrupado, la opción REBUILD reconstruye el índice agrupado.


SQL Server proporciona opciones para hacer ambas cosas, lo que sugiere que son diferentes

La razón por la que existen ambas sintaxis es porque una tabla no necesariamente tiene un índice agrupado. En otras palabras, ALTER INDEX ALL ON ... REBUILDno afecta a un montón (aunque tocará todos los no agrupados), por lo que la otra ruta cumple ese propósito.

Además, aunque la documentación no lo dice explícitamente, la ALTER TABLE ... REBUILDsintaxis no habilita / deshabilita la compresión de todos los índices no agrupados en la tabla. Solo afecta al montón o al índice agrupado.

Finalmente, si está probando esto a través de SSMS, tenga en cuenta que puede obtener errores al deshabilitar la compresión: realice un script para poder ver lo que realmente está sucediendo.

Jon Seigel
fuente
Gracias Jon, buena explicación clara! Y es bueno escuchar que las cosas funcionan como esperaba que deberían (¡lo cual definitivamente no siempre es el caso!)
PaulH
4

El índice agrupado es la tabla. Por lo tanto, configurarlo es igual. Puede validar esto comparando ambos casos aquí:

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 también proporciona varias formas diferentes de hacer que una columna sea única:

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);

Todo esto terminará con la misma implementación subyacente (con diferentes nombres).

El hecho de que haya diferentes maneras de llegar al trabajo no significa que todavía no termines en la oficina. :-)

Aaron Bertrand
fuente