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

Diviser une partition en deux dans SQL Server (T-SQL)

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.