Lorsque vous compressez une table partitionnée dans SQL Server, vous pouvez compresser toutes les partitions, certaines ou une seule partition.
Pour ce faire, utilisez le REBUILD PARTITION
syntaxe dans ALTER TABLE
déclaration.
Ce faisant, vous pouvez reconstruire uniquement la partition spécifiée ou toutes les partitions. Alternativement, vous pouvez reconstruire toutes les partitions, tout en compressant uniquement une partition spécifique ou une liste de partitions.
Exemple 1 - Reconstruire une partition
Dans ce premier exemple, nous reconstruisons et compressons une seule partition dans la table.
Estimer les économies de compression
Imaginons que nous voulions compresser une seule partition dans une table appelée Movies
.
Tout d'abord, nous pouvons utiliser le sp_estimate_data_compression_savings
procédure stockée du système pour estimer les économies que nous obtiendrions de la compression de la table.
EXEC sp_estimate_data_compression_savings
@schema_name = 'dbo',
@object_name = 'Movies',
@index_id = NULL,
@partition_number = 3,
@data_compression = 'ROW';
Résultat (en utilisant la sortie verticale) :
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
Selon sp_estimate_data_compression_savings
, la taille de la partition devrait passer de 120 Ko à 88 Ko une fois que nous l'aurons compressée.
Compresser la partition
Allons-y et compressons-le.
ALTER TABLE Movies
REBUILD PARTITION = 3 WITH (DATA_COMPRESSION = ROW);
Dans ce cas, j'ai utilisé la compression de ligne.
Vérifier les économies de compression
Maintenant, si nous interrogeons sp_estimate_data_compression_savings
encore une fois, nous verrons que la taille actuelle est maintenant exactement celle estimée précédemment (88 Ko).
EXEC sp_estimate_data_compression_savings
@schema_name = 'dbo',
@object_name = 'Movies',
@index_id = NULL,
@partition_number = 3,
@data_compression = 'NONE';
Résultat (en utilisant la sortie verticale) :
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
Dans cet exemple, j'obtiens une estimation de l'espace requis si je devais supprimer la compression (c'est-à-dire la définir sur NONE
).
Vérifiez quelles partitions utilisent la compression
Nous pouvons également utiliser les sys.partitions
view pour vérifier que la partition est compressée.
SELECT
[partition_number],
[data_compression],
[data_compression_desc]
FROM sys.partitions
WHERE object_id = OBJECT_ID('Movies');
Résultat :
+--------------------+--------------------+-------------------------+ | partition_number | data_compression | data_compression_desc | |--------------------+--------------------+-------------------------| | 1 | 0 | NONE | | 2 | 0 | NONE | | 4 | 0 | NONE | | 3 | 1 | ROW | +--------------------+--------------------+-------------------------+
Supprimer la compression
Avant de passer à l'exemple 2, supprimons la compression de la partition.
ALTER TABLE Movies
REBUILD PARTITION = 3 WITH (DATA_COMPRESSION = NONE);
Exemple 2 - Compresser plusieurs partitions
Dans cet exemple, nous reconstruisons toutes les partitions, mais spécifions uniquement les partitions que nous voulons compresser.
Il s'agit d'une méthode alternative à notre premier exemple. En utilisant cette syntaxe, nous pouvons spécifier une liste de partitions à compresser.
ALTER TABLE Movies
REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = ROW ON PARTITIONS(2,3));
Dans ce cas, j'ai reconstruit toutes les partitions, mais je n'ai compressé que les partitions 2 et 3.
Encore une fois, nous pouvons utiliser sys.partitions
pour vérifier qu'ils ont été compressés.
SELECT
[partition_number],
[data_compression],
[data_compression_desc]
FROM sys.partitions
WHERE object_id = OBJECT_ID('Movies');
Résultat :
+--------------------+--------------------+-------------------------+ | partition_number | data_compression | data_compression_desc | |--------------------+--------------------+-------------------------| | 1 | 0 | NONE | | 2 | 1 | ROW | | 3 | 1 | ROW | | 4 | 0 | NONE | +--------------------+--------------------+-------------------------+