¿Cuál es la diferencia entre la compresión en el PK y en la tabla?

9

La compresión de datos se puede establecer en la tabla:

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)

Y se puede definir en la clave 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) 

Pero si lo pones en ambos, obtienes este error:

La opción DATA_COMPRESSION se especificó más de una vez para la tabla, o para al menos una de sus particiones si la tabla está particionada.

¿Hay alguna diferencia entre ponerlo en PK y en la mesa?

Vaccano
fuente
¿Crees que habría una diferencia si la clave principal no fuera la columna agrupada de la tabla? :)
LowlyDBA
1
@JohnM: Supongo que sí, pero no lo sé. (Es por eso que estoy preguntando :)
Vaccano

Respuestas:

14

No se trata de poner compresión en una clave primaria, sino de poner la compresión en el índice agrupado . Para SQL Server, un índice agrupado está organizando la estructura física de la tabla en ese índice. O, en forma más corta, el índice agrupado es la tabla. Esto significa que comprimir el índice agrupado y comprimir la tabla son funcionalmente equivalentes. Si tuviera que crear su clave primaria como un índice no agrupado y mantener la tabla base como un montón, estas dos estructuras serían diferentes y se comprimirían por separado.

Mike Fal
fuente
¿Qué pasaría si, desafiando toda racionalidad, hiciera que su clave primaria fuera un índice no agrupado y creara un índice agrupado diferente? ¿La compresión sería la misma otra vez?
Ross Presser
1
No debería. No pienses en la clave principal aquí, es irrelevante. Tenemos que centrarnos en los índices aquí, agrupados y no agrupados. No puede comprimir por separado un índice agrupado y una tabla porque son el mismo objeto. Los índices / tablas agrupados y los índices no agrupados son objetos diferentes y deben comprimirse individualmente.
Mike Fal
Me expresé mal. Su respuesta es exactamente a lo que conducía: el índice agrupado se puede comprimir (lo que sea que esté indexando) o el montón se puede comprimir (si no hay un índice agrupado), no ambos. Y un índice no agrupado también se puede comprimir, por separado.
Ross Presser
Exactamente, pero para ser claros, no puede tener un montón y un índice agrupado en la misma tabla. Es una u otra. Debido a cómo se comporta SQL Server, es común que las personas confundan las claves primarias con los índices agrupados, por lo que quiero asegurarme de que se entienda la diferencia para esta respuesta.
Mike Fal