Compactação de índice agrupada versus compactação de tabela - são a mesma coisa?

8

Se eu definir a compactação (página ou linha) no índice clusterizado de uma tabela, isso é o mesmo que definir compactação na tabela?

O SQL Server fornece opções para fazer as duas coisas, o que sugere que elas são diferentes, mas fiquei com a impressão de que um índice em cluster e uma tabela eram essencialmente a mesma coisa, e meu modelo mental de como os índices em cluster funcionam me diz que compactar o índice em cluster também deve compactar a tabela.

paulH
fonte

Respostas:

11

Se eu definir a compactação (página ou linha) no índice clusterizado de uma tabela, isso é o mesmo que definir compactação na tabela?

Sim.

Do MSDN :

Use a sintaxe REBUILD WITH para recriar uma tabela inteira, incluindo todas as partições em uma tabela particionada. Se a tabela tiver um índice em cluster, a opção REBUILD recria o índice em cluster.


O SQL Server fornece opções para fazer as duas coisas, o que sugere que elas são diferentes

A razão pela qual existem duas sintaxes é porque a tabela não necessariamente têm um índice agrupado. Em outras palavras, ALTER INDEX ALL ON ... REBUILDnão afeta um heap (embora ele toque em todos os não clusterizados); portanto, a outra rota serve a esse propósito.

Além disso, embora a documentação não o diga explicitamente, a ALTER TABLE ... REBUILDsintaxe não habilita / desabilita a compactação de todos os índices não clusterizados na tabela. Isso afeta apenas o heap ou o índice clusterizado.

Por fim, se você estiver testando isso através do SSMS, esteja ciente de que poderá receber erros ao desativar a compactação - escreva as coisas para que você possa ver o que realmente está acontecendo.

Jon Seigel
fonte
Obrigado Jon, boa explicação clara! E seu bom ouvir que as coisas funcionam como eu esperava que deveriam (que definitivamente não é sempre o caso!)
PaulH
4

O índice clusterizado é a tabela. Então, defini-lo em qualquer um é o mesmo. Você pode validar isso comparando os dois casos aqui:

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;

O SQL Server também fornece várias maneiras diferentes de tornar uma coluna exclusiva:

CREATE TABLE dbo.foo1(bar INT UNIQUE);

...ou...

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

...ou...

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

...ou...

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

Todos eles acabam com a mesma implementação subjacente (com nomes diferentes).

Só porque existem maneiras diferentes de começar a trabalhar não significa que você ainda não acaba no escritório. :-)

Aaron Bertrand
fonte