Modification d’une fonction de partition

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance

Vous pouvez changer le partitionnement d’une table ou d’un index dans SQL Server, Azure SQL Database et Azure SQL Managed Instance en ajoutant ou supprimant le nombre de partitions spécifié, par incréments de 1, dans la fonction de partition de la table ou de l’index partitionné à l’aide de Transact-SQL. Lorsque vous ajoutez une partition, vous fractionnez une partition existante en deux partitions dont vous redéfinissez les limites. Lorsque vous supprimez une partition, vous fusionnez les limites de deux partitions pour n'en définir qu'une. Cette action a pour effet de remplir à nouveau une partition et de laisser l'autre non affectée. Passez en revue les meilleures pratiques avant de modifier une fonction de partition.

Attention

Une même fonction de partition peut être utilisée par plusieurs tables ou index. Lorsque vous modifiez une fonction de partition, vous affectez toutes les fonctions dans une transaction unique. Vérifiez les dépendances de la fonction de partition avant de la modifier.

Le partitionnement de tables est également disponible dans les pools SQL dédiés dans Azure Synapse Analytics, avec certaines différences de syntaxe. Pour en savoir plus, consultez Partitionnement de tables dans un pool SQL dédié.

Limites

  • Vous ne pouvez utiliser ALTER PARTITION FUNCTION que pour diviser une partition en deux ou pour fusionner deux partitions en une seule. Pour modifier le mode de partitionnement d'une table ou d'un index (par exemple, pour passer de 10 à 5 partitions), vous disposez de plusieurs options :

    • Créez une nouvelle table partitionnée en utilisant la fonction de partition souhaitée, puis insérez les données de l’ancienne table dans la nouvelle table en utilisant soit une instruction Transact-SQL INSERT INTO ... SELECT FROM, soit l’Assistant de gestion des partitions dans SQL Server Management Studio (SSMS).

    • Créez un index cluster partitionné sur un segment de mémoire.

      Notes

      La suppression d'un index cluster partitionné engendre un segment partitionné.

    • Excluez et régénérez 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.

  • Le moteur de base de données n’assure pas la prise en charge de la réplication lors de la modification d’une fonction de partition. Si vous voulez apporter des modifications à une fonction de partition dans la base de données de publication, vous devez le faire manuellement dans la base d'abonnement.

  • Tous les groupes de fichiers concernés par l’instruction ALTER PARTITION FUNCTION doivent être en ligne.

autorisations

L'instruction ALTER PARTITION FUNCTION peut être exécutée avec les autorisations suivantes :

  • Autorisation ALTER ANY DATASPACE. Cette autorisation est attribuée 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.

Interrogation des objets partitionnés dans une base de données

La requête suivante répertorie tous les objets partitionnés d’une base de données. Cela peut être utilisé pour vérifier les dépendances d’une fonction de partition avant de la modifier.

SELECT 
	PF.name AS PartitionFunction,
	ds.name AS PartitionScheme,
    OBJECT_SCHEMA_NAME(si.object_id) as SchemaName,
	OBJECT_NAME(si.object_id) AS PartitionedTable, 
	si.name as IndexName
FROM sys.indexes AS si
JOIN sys.data_spaces AS ds
	ON ds.data_space_id = si.data_space_id
JOIN sys.partition_schemes AS PS
	ON PS.data_space_id = si.data_space_id
JOIN sys.partition_functions AS PF
	ON PF.function_id = PS.function_id
WHERE ds.type = 'PS'
AND OBJECTPROPERTYEX(si.object_id, 'BaseType') = 'U'
ORDER BY PartitionFunction, PartitionScheme, SchemaName, PartitionedTable;

Fractionnement d’une partition avec Transact-SQL

  1. Dans l’Explorateur d’objets, connectez-vous à votre base de données cible.

  2. Dans la barre d’outils standard, sélectionnez Nouvelle requête.

  3. Copiez et collez l’exemple suivant dans la fenêtre de requête, puis sélectionnez Exécuter.

    Cet exemple :

    • Recherche une version précédente de la fonction de partition myRangePF1 et la supprime si elle existe.
    • Crée une fonction de partition appelée myRangePF1 qui partitionne une table en quatre partitions.
    • Fractionne la partition entre les valeurs de délimitation boundary_values 100 et 1000 pour créer une partition entre les valeurs limites boundary_values 100 et 500 et une autre partition entre les valeurs limites boundary_values 500 et 1000.
    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  
    
    ALTER PARTITION FUNCTION myRangePF1 ()  
    SPLIT RANGE (500);  
    

Fusion de deux partitions avec Transact-SQL

  1. Dans l’Explorateur d’objets, connectez-vous à votre base de données cible.

  2. Dans la barre d’outils standard, sélectionnez Nouvelle requête.

  3. Copiez et collez l’exemple suivant dans la fenêtre de requête, puis sélectionnez Exécuter.

    Cet exemple :

    • Recherche une version précédente de la fonction de partition myRangePF1 et la supprime si elle est trouvée.
    • Crée une fonction de partition appelée myRangePF1 avec trois valeurs de délimitation, ce qui donnera lieu à quatre partitions.
    • Fusionne la partition entre les valeurs de délimitation boundary_values 1 et 100 avec la partition comprise entre les valeurs de délimitation boundary_values 100 et 1 000.
    • Ainsi, la fonction de partition myRangePF1 a deux points limites, 1 et 1 000.
    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  
    
    ALTER PARTITION FUNCTION myRangePF1 ()  
    MERGE RANGE (100);  
    

Suppression d’une fonction de partition avec SSMS

  1. Dans l’Explorateur d’objets, connectez-vous à votre base de données cible.

  2. Développez la base de données dans laquelle vous souhaitez supprimer la fonction de partition, puis développer le dossier Stockage .

  3. Développez le dossier Fonctions de partition .

  4. Cliquez avec le bouton droit sur la fonction de partition à supprimer, puis sélectionnez Supprimer.

  5. Dans la boîte de dialogue Supprimer un objet, assurez-vous que la fonction de partition est sélectionnée, puis sélectionnez OK.

Étapes suivantes

En savoir plus sur les concepts associés dans les articles suivants :