Ao compactar uma tabela particionada no SQL Server, você pode compactar todas as partições, algumas ou apenas uma partição.
Para fazer isso, use a
REBUILD PARTITION
sintaxe dentro do ALTER TABLE
demonstração. Ao fazer isso, você pode reconstruir apenas a partição especificada ou todas as partições. Alternativamente, você pode reconstruir todas as partições, enquanto comprime apenas uma partição específica ou uma lista de partições.
Exemplo 1 – Reconstruir uma partição
Neste primeiro exemplo, reconstruímos e compactamos apenas uma partição na tabela.
Estimar economia de compactação
Imagine que queremos compactar uma única partição em uma tabela chamada
Movies
. Primeiro, podemos usar o
sp_estimate_data_compression_savings
procedimento armazenado do sistema para estimar a economia que obteríamos com a compactação da tabela. EXEC sp_estimate_data_compression_savings
@schema_name = 'dbo',
@object_name = 'Movies',
@index_id = NULL,
@partition_number = 3,
@data_compression = 'ROW';
Resultado (usando saída vertical):
object_name | Movies schema_name | dbo index_id | 1 partition_number | 3 size_with_current_compression_setting(KB) | 120 size_with_requested_compression_setting(KB) | 88 sample_size_with_current_compression_setting(KB) | 128 sample_size_with_requested_compression_setting(KB) | 96
De acordo com
sp_estimate_data_compression_savings
, o tamanho da partição deve ser reduzido de 120 KB para 88 KB após a compactação. Compactar a partição
Vamos em frente e comprimi-lo.
ALTER TABLE Movies
REBUILD PARTITION = 3 WITH (DATA_COMPRESSION = ROW);
Neste caso eu usei compressão de linha.
Verifique a economia de compactação
Agora, se consultarmos
sp_estimate_data_compression_savings
novamente, veremos que o tamanho atual agora é exatamente como estimado anteriormente (88 KB). EXEC sp_estimate_data_compression_savings
@schema_name = 'dbo',
@object_name = 'Movies',
@index_id = NULL,
@partition_number = 3,
@data_compression = 'NONE';
Resultado (usando saída vertical):
object_name | Movies schema_name | dbo index_id | 1 partition_number | 3 size_with_current_compression_setting(KB) | 88 size_with_requested_compression_setting(KB) | 112 sample_size_with_current_compression_setting(KB) | 96 sample_size_with_requested_compression_setting(KB) | 128
Neste exemplo, estou obtendo uma estimativa dos requisitos de espaço se eu remover a compactação (ou seja, defini-la como
NONE
). Verifique quais partições usam compactação
Também podemos usar o
sys.partitions
view para verificar se a partição tem compactação. SELECT
[partition_number],
[data_compression],
[data_compression_desc]
FROM sys.partitions
WHERE object_id = OBJECT_ID('Movies');
Resultado:
+--------------------+--------------------+-------------------------+ | partition_number | data_compression | data_compression_desc | |--------------------+--------------------+-------------------------| | 1 | 0 | NONE | | 2 | 0 | NONE | | 4 | 0 | NONE | | 3 | 1 | ROW | +--------------------+--------------------+-------------------------+
Remover compactação
Antes de irmos para o exemplo 2, vamos remover a compressão da partição.
ALTER TABLE Movies
REBUILD PARTITION = 3 WITH (DATA_COMPRESSION = NONE);
Exemplo 2 – Compactar várias partições
Neste exemplo, reconstruímos todas as partições, mas especificamos apenas as partições que queremos compactar.
Este é um método alternativo ao nosso primeiro exemplo. Usando essa sintaxe, podemos especificar uma lista de partições para compactar.
ALTER TABLE Movies
REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = ROW ON PARTITIONS(2,3));
Nesse caso, reconstruí todas as partições, mas comprimi apenas as partições 2 e 3.
Novamente, podemos usar
sys.partitions
para verificar se foram compactados. SELECT
[partition_number],
[data_compression],
[data_compression_desc]
FROM sys.partitions
WHERE object_id = OBJECT_ID('Movies');
Resultado:
+--------------------+--------------------+-------------------------+ | partition_number | data_compression | data_compression_desc | |--------------------+--------------------+-------------------------| | 1 | 0 | NONE | | 2 | 1 | ROW | | 3 | 1 | ROW | | 4 | 0 | NONE | +--------------------+--------------------+-------------------------+