Modificare una funzione di partizione

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di Azure

È possibile modificare la modalità di partizionamento di una tabella o di un indice in SQL Server, database SQL di Azure e Istanza gestita di SQL di Azure aggiungendo o sottraendo, con incrementi di 1, il numero di partizioni specificate nella funzione di partizione dell'indice o della tabella partizionata tramite Transact-SQL. L'aggiunta di una partizione consiste nel "suddividere" una partizione esistente in due partizioni e nel ridefinire i limiti delle nuove partizioni. L'eliminazione di una partizione consiste nell'"unire" i limiti di due partizioni in modo da ottenerne una. L'ultima operazione consiste nel ripopolare una partizione lasciando l'altra non assegnata. Esaminare le procedure consigliate prima di modificare una funzione di partizione.

Attenzione

La stessa funzione di partizione può essere utilizzata da più tabelle o indici. La modifica di una funzione di partizione viene applicata a tutti gli elementi in un'unica transazione. Controllare le dipendenze della funzione di partizione prima di modificarla.

Il partizionamento delle tabelle è disponibile anche nei pool SQL dedicati in Azure Synapse Analytics, con alcune differenze di sintassi. Per altre informazioni, vedere Partizionamento di tabelle nel pool SQL dedicato.

Limiti

  • L'istruzione ALTER PARTITION FUNCTION può essere utilizzata solo per suddividere una partizione in due o per unire due partizioni in una. Per modificare la modalità di partizionamento di una tabella o un indice, ad esempio da 10 partizioni a 5, è possibile utilizzare una delle opzioni seguenti:

    • Creare una nuova tabella partizionata utilizzando la funzione di partizione desiderata e quindi inserire i dati della vecchia tabella in quella nuova utilizzando un'istruzione INSERT INTO ... SELECT FROM di Transact-SQL o la Gestione guidata partizione in SQL Server Management Studio (SSMS).

    • Creare un indice cluster partizionato su un heap.

      Nota

      L'eliminazione di un indice cluster partizionato ha come risultato un heap partizionato.

    • Eliminare e ricompilare un indice partizionato esistente tramite l'istruzione Transact-SQL CREATE INDEX con la clausola DROP EXISTING = ON.

    • Esecuzione di una sequenza di istruzioni ALTER PARTITION FUNCTION.

  • Il motore di database non fornisce il supporto della replica per la modifica di una funzione di partizione. Se si desidera apportare modifiche a una funzione di partizione nel database di pubblicazione, è necessario procedere manualmente nel database di sottoscrizione.

  • Tutti i filegroup interessati dall'istruzione ALTER PARTITION FUNCTION devono essere online.

Autorizzazioni

Per eseguire l'istruzione ALTER PARTITION FUNCTION, è necessario utilizzare le autorizzazioni seguenti:

  • Autorizzazione ALTER ANY DATASPACE. Questa autorizzazione viene concessa per impostazione predefinita al ruolo predefinito del server sysadmin e ai ruoli predefiniti del database db_owner e db_ddladmin .

  • Autorizzazione CONTROL o ALTER nel database in cui la funzione di partizione è stata creata.

  • Autorizzazione CONTROL SERVER o ALTER ANY DATABASE nel server del database in cui la funzione di partizione è stata creata.

Eseguire query su oggetti partizionati in un database

Nella query seguente sono riportati tutti gli oggetti partizionati in un database. Può essere usato per controllare le dipendenze per una funzione di partizione prima di modificarla.

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;

Dividere una partizione con Transact-SQL

  1. Connettersi al database di destinazione in Esplora oggetti.

  2. Sulla barra Standard selezionare Nuova query.

  3. Copiare e incollare l'esempio seguente nella finestra di query e selezionare Esegui.

    Questo esempio:

    • Verifica la presenza di una versione precedente della funzione di partizione myRangePF1 e la elimina se viene trovata.
    • Crea una funzione di partizione denominata myRangePF1 che partiziona una tabella in quattro partizioni.
    • Suddivide la partizione tra boundary_values 100 e 1.000 per creare una partizione tra boundary_values 100 e 500 e una partizione tra boundary_values 500 e 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 ()  
    SPLIT RANGE (500);  
    

Unire due partizioni con Transact-SQL

  1. Connettersi al database di destinazione in Esplora oggetti.

  2. Sulla barra Standard selezionare Nuova query.

  3. Copiare e incollare l'esempio seguente nella finestra di query e selezionare Esegui.

    Questo esempio:

    • Verifica la presenza di una versione precedente della funzione di partizione myRangePF1 e la elimina se viene trovata.
    • Crea una funzione di partizione denominata myRangePF1 con tre valori limite, che comporterà quattro partizioni.
    • Unisce la partizione tra boundary_values 1 e 100 con la partizione tra boundary_values 100 e 1.000.
    • Ciò comporta che la funzione di partizione myRangePF1 abbia due punti limite, 1 e 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);  
    

Eliminare una funzione di partizione con SSMS

  1. Connettersi al database di destinazione in Esplora oggetti.

  2. Espandere il database in cui si desidera eliminare la funzione di partizione ed espandere quindi la cartella Archiviazione .

  3. Espandere la cartella Funzioni di partizione .

  4. Fare clic con il pulsante destro del mouse sulla funzione di partizione che si vuole eliminare e scegliere Elimina.

  5. Nella finestra di dialogo Elimina oggetto verificare che sia selezionata la funzione di partizione corretta, quindi fare clic su OK.

Passaggi successivi

Altre informazioni sui concetti correlati sono disponibili negli articoli seguenti: