ALTER PARTITION FUNCTION (Transact-SQL)
Modifie une fonction de partition en divisant ou en fusionnant ses valeurs limites. En exécutant ALTER PARTITION FUNCTION, vous pouvez diviser une partition d'une table ou d'un index utilisant la fonction de partition en deux partitions, ou fusionner deux partitions dans une seule.
Attention |
---|
Une même fonction de partition peut être utilisée par plusieurs tables ou index. Ils sont alors tous affectés par ALTER PARTITION FUNCTION en une seule transaction. |
Syntaxe
ALTER PARTITION FUNCTION partition_function_name()
{
SPLIT RANGE ( boundary_value )
| MERGE RANGE ( boundary_value )
} [ ; ]
Arguments
partition_function_name
Nom de la fonction de partition à modifier.SPLIT RANGE ( boundary_value )
Ajoute une partition à la fonction de partition. boundary_value détermine la plage de la nouvelle partition. Elle doit être différente des plages limites existantes de la fonction de partition. En fonction de la valeur de boundary_value, le Moteur de base de données divise l'une des plages existantes en deux. De ces deux demi-plages, c'est celle qui contient boundary_value qui est considérée comme la nouvelle partition.Pour conserver la nouvelle partition, un groupe de fichiers doit être en ligne et être marqué par le schéma de partition qui utilise la fonction de partition comme étant le prochain utilisé (NEXT USED). Les groupes de fichiers sont alloués aux partitions dans une instruction CREATE PARTITION SCHEME. Si une instruction CREATE PARTITION SCHEME alloue plus de groupes de fichiers qu'il n'en faut (il y a alors moins de partitions créées dans l'instruction CREATE PARTITION FUNCTION qu'il n'y a de groupes de fichiers pour les accueillir), certains groupes de fichiers ne sont pas affectés, et l'un d'entre eux est marqué NEXT USED par le schéma de partition. C'est ce groupe de fichiers qui accueillera la nouvelle partition. Si aucun groupe de fichiers n'est marqué NEXT USED par le schéma de partition, vous devez utiliser ALTER PARTITION SCHEME pour ajouter un groupe de fichiers, ou en désigner un existant, afin d'accueillir la nouvelle partition. Un groupe de fichiers contenant déjà des partitions peut être désigné pour accueillir des partitions supplémentaires. Étant donné qu'une fonction de partition peut participer à plusieurs schémas de partition, tous les schémas de partition utilisant la fonction de partition à laquelle vous ajoutez des partitions doivent contenir un groupe de fichiers NEXT USED. À défaut, ALTER PARTITION FUNCTION échoue et génère une erreur indiquant le ou les schémas de partition qui sont dépourvus d'un groupe de fichiers NEXT USED.
Si vous créez toutes les partitions dans le même groupe de fichiers, ce dernier est défini initialement comme étant automatiquement le groupe NEXT USED. Toutefois, suite à une opération de fractionnement, il n'existe plus de groupe de fichiers NEXT USED désigné. Vous devez attribuer explicitement le groupe de fichiers devant être le groupe de fichiers NEXT USED à l'aide d'ALTER PARITION SCHEME, faute de quoi la prochaine opération de fractionnement échouera.
MERGE [ RANGE ( boundary_value) ]
Supprime une partition et fusionne les valeurs qui existent dans la partition dans l'une des partitions restantes. RANGE (boundary_value) doit être une valeur limite existante dans laquelle les valeurs de la partition supprimée sont fusionnées. Le groupe de fichiers qui contenait initialement boundary_value est supprimé du schéma de partition, sauf s'il est utilisé par une partition restante, ou s'il est marqué de la propriété NEXT USED. La partition fusionnée réside dans le groupe de fichiers qui ne contenait pas initialement boundary_value. boundary_value est une expression constante qui peut faire référence à des variables (y compris des variables de type défini par l'utilisateur) ou à des fonctions (y compris des fonctions définies par l'utilisateur). En revanche, elle ne peut pas faire référence à une expression Transact-SQL. boundary_value doit correspondre ou être implicitement convertible dans le type de données de sa colonne de partitionnement correspondante, et ne doit pas être tronquée lors de la conversion implicite d'une manière où la taille et l'échelle de la valeur ne correspondraient pas à son attribut input_parameter_type correspondant.
Meilleures pratiques
Conservez toujours des partitions vides aux deux extrémités de la plage de partitions de façon à garantir que le fractionnement des partitions (avant de charger de nouvelles données) et la fusion des partitions (après avoir déchargé d'anciennes données) ne subissent pas de déplacement des données. Évitez de fractionner ou fusionner des partitions remplies. Ces opérations peuvent être extrêmement inefficaces, car la génération des journaux peut prendre jusqu'à quatre fois plus de temps et cela peut également provoquer un verrouillage grave.
Limitations et restrictions
ALTER PARTITION FUNCTION repartitionne les tables et les index qui utilisent la fonction en une opération atomique unique. Toutefois, cette opération se produit hors ligne et, selon l'étendue du repartitionnement, elle peut s'avérer gourmande en ressources.
L'utilisation de ALTER PARTITION FUNCTION doit uniquement viser à diviser une partition en deux, ou à fusionner deux partitions dans une seule. Pour modifier la façon dont une table est partitionnée (par exemple, de 10 partitions à 5), vous pouvez utiliser l'une des options indiquées ci-dessous. La consommation en ressources de ces options peut varier en fonction de la configuration de votre système.
Créez une nouvelle table partitionnée avec la fonction de partition de votre choix, puis insérez les données de l'ancienne table dans la nouvelle à l'aide de l'instruction INSERT INTO...SELECT FROM.
Créez un index cluster partitionné sur un segment.
Notes
La suppression d'un index cluster partitionné engendre un segment partitionné.
Supprimez et reconstruisez un index partitionné existant à l'aide de l'instruction Transact-SQL CREATE INDEX avec la clause DROP EXISTING = ON.
Exécutez une séquence d'instructions ALTER PARTITION FUNCTION.
Tous les groupes de fichiers concernés par l'instruction ALTER PARITITION FUNCTION doivent être en ligne.
ALTER PARTITION FUNCTION échoue s'il existe un index cluster désactivé dans une table qui utilise la fonction de partition.
SQL Server ne prend pas en charge la réplication dans le cadre de la modification d'une fonction de partition. Les modifications apportées à une fonction de partition dans la base de données de publication doivent être appliquées manuellement dans la base de données d'abonnement.
Autorisations
L'instruction ALTER PARTITION FUNCTION peut être exécutée avec les autorisations suivantes :
Autorisation ALTER ANY DATASPACE. Cette autorisation revient par défaut aux membres du rôle de serveur fixe sysadmin et des rôles de base de données fixes db_owner et db_ddladmin.
Autorisation CONTROL ou ALTER sur la base de données dans laquelle la fonction de partition a été créée.
Autorisation CONTROL SERVER ou ALTER ANY DATABASE sur le serveur de la base de données dans laquelle la fonction de partition a été créée.
Exemples
A. Division d'une partition de table ou d'index partitionné en deux partitions
L'exemple suivant illustre la création d'une fonction de partition pour partitionner une table ou un index en quatre partitions. ALTER PARTITION FUNCTION divise l'une des partitions en deux pour créer au total cinq partitions.
IF EXISTS (SELECT * FROM sys.partition_functions
WHERE name = 'myRangePF1')
DROP PARTITION FUNCTION myRangePF1;
GO
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );
GO
--Split the partition between boundary_values 100 and 1000
--to create two partitions between boundary_values 100 and 500
--and between boundary_values 500 and 1000.
ALTER PARTITION FUNCTION myRangePF1 ()
SPLIT RANGE (500);
B. Fusion de deux partitions d'une table partitionnée en une seule partition
L'exemple suivant crée une fonction de partition (identique à celle de l'exemple précédent), puis fusionne deux des partitions en une seule partition, pour un total de trois partitions.
IF EXISTS (SELECT * FROM sys.partition_functions
WHERE name = 'myRangePF1')
DROP PARTITION FUNCTION myRangePF1;
GO
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );
GO
--Merge the partitions between boundary_values 1 and 100
--and between boundary_values 100 and 1000 to create one partition
--between boundary_values 1 and 1000.
ALTER PARTITION FUNCTION myRangePF1 ()
MERGE RANGE (100);
Voir aussi