Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Compactar uma partição específica dentro de uma tabela no SQL Server (T-SQL)


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                    |
+--------------------+--------------------+-------------------------+