Qual é a diferença entre a compactação no PK e a tabela?

9

A compactação de dados pode ser definida na tabela:

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 pode ser definido na chave primária:

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) 

Mas se você colocá-lo em ambos, você receberá este erro:

A opção DATA_COMPRESSION foi especificada mais de uma vez para a tabela ou para pelo menos uma de suas partições se a tabela estiver particionada.

Existe alguma diferença em colocá-lo no PK vs na mesa?

Vaccano
fonte
Você acha que haveria diferença se a chave primária não fosse a coluna agrupada da tabela? :)
LowlyDBA
11
@ JohnM: Eu acho que sim, mas eu não sei. (É por isso que eu estou pedindo :)
Vaccano

Respostas:

14

Não se trata de colocar a compactação em uma chave primária, mas de colocar a compactação no índice clusterizado . Para o SQL Server, um índice em cluster está organizando a estrutura física da tabela nesse índice. Ou, de forma mais curta, o índice clusterizado é a tabela. Isso significa que compactar o índice em cluster e compactar a tabela são funcionalmente equivalentes. Se você criar sua chave primária como um índice não agrupado em cluster e manter a tabela base como um heap, essas duas estruturas serão diferentes e compactadas separadamente.

Mike Fal
fonte
E se, desafiando toda a racionalidade, você transformou sua chave primária em um índice não clusterizado e criou um índice clusterizado diferente? A compactação seria a mesma novamente?
precisa
11
Não seria. Não pense na chave primária aqui, é irrelevante. Precisamos focar nos índices aqui, agrupados e não agrupados. Você não pode compactar separadamente um índice em cluster e uma tabela porque eles são o mesmo objeto. índices / tabelas agrupados e índices não agrupados são objetos diferentes e precisam ser compactados individualmente.
quer
Eu me expressei mal. Sua resposta é exatamente para onde eu estava dirigindo - o índice clusterizado pode ser compactado (o que quer que esteja indexando) ou o heap pode ser compactado (se não houver índice clusterizado), não os dois. E um índice não agrupado também pode ser compactado, separadamente.
Ross Presser
Exatamente, mas, para ficar claro, você não pode ter um heap e um índice clusterizado na mesma tabela. É um ou outro. Por causa de como o SQL Server se comporta, é comum que as pessoas confundam chaves primárias com índices em cluster, por isso quero garantir que a diferença seja entendida para esta resposta.
Mike Fal