Dans SQL Server, vous pouvez utiliser la ALTER PARTITION FUNCTION
pour fusionner deux partitions en une seule.
Pour cela, utilisez le MERGE RANGE
argument, tout en fournissant la valeur limite de la partition à supprimer.
Cette opération supprime la partition et fusionne toutes les valeurs qui existent dans la partition dans une partition restante.
Exemple
Imaginez que nous ayons cinq partitions que nous voulons devenir quatre.
Partitions actuelles
Nous avons une fonction de partition appelée MoviesPartitionFunction
avec quatre valeurs limites.
SELECT
prv.boundary_id,
prv.[value]
FROM sys.partition_range_values prv
INNER JOIN sys.partition_functions pf
ON prv.function_id = pf.function_id
WHERE pf.name = 'MoviesPartitionFunction';
Résultat :
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 500 | | 4 | 10000 | +---------------+---------+
Cela signifie qu'il y a cinq partitions.
Pour cet exemple, nous allons supprimer la plage de limites 500.
Imaginez également que nous ayons déjà une table avec des données réparties sur certaines de ces partitions.
Voici comment les lignes sont actuellement réparties sur les partitions.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Résultat :
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 400 | | 4 | 3579 | | 5 | 0 | +--------------------+-------------+
Je dois souligner que Microsoft déconseille en fait de fusionner (ou de diviser) des partitions contenant des données. Cependant, pour les besoins de cet exemple, nous ferons fi du vent et fusionnerons deux partitions contenant des données.
Fusionner les partitions
OK, fusionnons les partitions.
ALTER PARTITION FUNCTION MoviesPartitionFunction()
MERGE RANGE (500);
Résultat :
Commands completed successfully.
Nous avons réussi à fusionner les partitions.
Vérifier le résultat
Vérifions le résultat.
SELECT
prv.boundary_id,
prv.[value]
FROM sys.partition_range_values prv
INNER JOIN sys.partition_functions pf
ON prv.function_id = pf.function_id
WHERE pf.name = 'MoviesPartitionFunction';
Résultat :
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 10000 | +---------------+---------+
Comme prévu, la plage de limites de 500 a été abandonnée et il ne nous reste plus que trois plages de limites.
Voyons comment les données sont réparties sur les partitions.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Résultat :
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Encore une fois comme prévu, les données des partitions 3 et 4 ont fusionné en une seule partition (partition 3).
Pourquoi avoir des partitions vides ?
Si vous vous demandez pourquoi j'ai des partitions vides à chaque extrémité, cela est fait spécifiquement pour faciliter le fractionnement et la fusion des partitions.
Garder les partitions vides à chaque extrémité empêche tout mouvement de données inattendu que vous pourriez obtenir lors du fractionnement ou de la fusion de partitions.
Cette pratique est également recommandée par Microsoft, précisément pour cette raison.
Fusionner des partitions contenant des données
Comme mentionné, Microsoft déconseille de fusionner des partitions contenant déjà des données.
Le fractionnement ou la fusion de partitions peuplées peut être inefficace. Ils peuvent être inefficaces car la division ou la fusion peut entraîner jusqu'à quatre fois plus de génération de journaux et peut également provoquer un verrouillage important.