Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Fusionner deux partitions en une seule dans SQL Server (T-SQL)

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.