Modifier une fonction de partition

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Vous pouvez modifier la façon dont une table ou un index est partitionné dans SQL Server, Azure SQL Database et Azure SQL Managed Instance en ajoutant ou soustrayant le nombre de partitions spécifiées, 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 bonnes 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. En savoir plus sur le partitionnement de tables dans un pool SQL dédié.

Limitations

  • 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 table partitionnée avec la fonction de partition souhaitée, puis insérez les données de l’ancienne table dans la nouvelle table à l’aide d’une instruction INSERT INTO ... INSTRUCTION SELECT FROM Transact-SQL ou Assistant Gestion de partition dans SQL Server Management Studio (SSMS).

    • Créez un index cluster partitionné sur un tas.

      Notes

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

    • Supprimez 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 ne prend pas en charge la réplication pour 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.

Interroger 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;

Fractionner 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 myRangePF1 de partition et la supprime si elle est trouvée.
    • Crée une fonction de partition appelée myRangePF1 qui partitionne une table en quatre partitions.
    • Fractionne la partition entre boundary_values 100 et 1000 pour créer une partition comprise entre boundary_values 100 et 500 et une partition comprise entre 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);  
    

Fusionner 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 :

    • Vérifie si une version précédente de la fonction myRangePF1 de partition existe et la supprime si elle est trouvée.
    • Crée une fonction de partition appelée myRangePF1 avec trois valeurs de limite, ce qui entraîne quatre partitions.
    • Fusionne la partition entre boundary_values 1 et 100 avec la partition comprise entre boundary_values 100 et 1 000.
    • Ainsi, la fonction myRangePF1 de partition a deux points de limite, 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);  
    

Supprimer 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 l’objet , vérifiez que la fonction de partition correcte est sélectionnée, puis sélectionnez OK.

Étapes suivantes

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