Si vous avez une table ou un index partitionné dans SQL Server, mais que vous avez besoin de plus de partitions, vous pouvez ajouter une partition à la fonction de partition à l'aide de ALTER PARTITION FUNCTION
instruction avec la SPLIT RANGE
arguments.
Lorsque vous faites cela, vous divisez une partition existante en deux.
Exemple
Voici un exemple à démontrer. Examinons d'abord notre configuration actuelle.
Configuration actuelle
Nous avons déjà quatre partitions, et nous voulons en ajouter une cinquième.
Nous avons donc déjà créé une fonction de partition comme celle-ci :
CREATE PARTITION FUNCTION MoviesPartitionFunction (int)
AS RANGE LEFT FOR VALUES (-1, 100, 10000);
Ce code donne des partitions qui stockent les valeurs comme suit.
Partitionner | Valeurs |
---|---|
1 | <=–1 |
2 | > –1 ET <=100 |
3 | > 100 ET <=10000 |
4 | > 10000 |
Pour cet exemple, nous ajouterons une nouvelle valeur limite de 500.
Nous voulons donc qu'il ressemble à ceci :
Partitionner | Valeurs |
---|---|
1 | <=–1 |
2 | > –1 ET <=100 |
3 | > 100 ET <=500 |
4 | > 500 ET <=10000 |
5 | > 10000 |
De plus, pour les besoins de cet exemple, imaginons que nous ayons une table partitionnée à l'aide de la fonction de partition ci-dessus, et qu'elle contienne actuellement un peu plus de quatre mille lignes de données.
Voyons rapidement comment les lignes sont réparties sur nos 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 | +--------------------+-------------+
Nous voulons donc maintenant ajouter une nouvelle partition avec une valeur limite de 500.
Dans ce cas, nous diviserons la partition entre les valeurs limites 100 et 10000.
Je dois mentionner que Microsoft recommande de ne pas diviser les partitions peuplées. C'est donc quelque chose à garder à l'esprit.
Cependant, pour les besoins de cet exemple, nous allons diviser une partition contenant des données.
Diviser la partition
Voici où nous allons de l'avant et divisons la partition.
Nous utilisons la ALTER PARTITION FUNCTION
déclaration pour diviser la partition.
Cependant, le fractionnement d'une partition crée deux partitions sur une, et nous devons donc nous assurer qu'il existe un groupe de fichiers pour la nouvelle partition. Nous devons également nous assurer que notre schéma de partition sait quel groupe de fichiers utiliser lorsque nous divisons la partition.
Vous pouvez utiliser un groupe de fichiers existant ou en créer un nouveau.
Créons-en un nouveau.
Voici le code que nous pouvons utiliser pour faire tout ce qui précède :
ALTER DATABASE Test ADD FILEGROUP MoviesFg5;
ALTER DATABASE Test
ADD FILE
(
NAME = MoviesFg5dat,
FILENAME = '/var/opt/mssql/data/MoviesFg5dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP MoviesFg5;
ALTER PARTITION SCHEME MoviesPartitionScheme
NEXT USED MoviesFg5;
ALTER PARTITION FUNCTION MoviesPartitionFunction()
SPLIT RANGE (500);
Résultat :
Commands completed successfully.
Nous avons réussi à diviser la partition.
Vérifier le fractionnement
Nous pouvons maintenant vérifier que la fonction de partition a été modifiée pour refléter les nouvelles 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 | +---------------+---------+
Nous pouvons donc voir que la nouvelle valeur limite a été ajoutée avec succès.
Et voici comment les données sont désormais 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 | +--------------------+-------------+
Nous avons donc maintenant 5 partitions.
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.
Fractionner des partitions contenant des données
Comme mentionné, Microsoft recommande de ne pas diviser les partitions qui contiennent 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.