ALTER PARTITION FUNCTION (Transact-SQL)

Si applica a:SQL Server database SQL di Azure Istanza gestita di SQL di Azure

Modifica una funzione di partizione mediante la suddivisione o l'unione dei relativi valori limite. L'esecuzione di un'istruzione ALTER PARTITION FUNCTION può suddividere in due partizioni una partizione di tabella o di indice che usa la funzione di partizione. L'istruzione può anche unire due partizioni in un'unica partizione.

Attenzione

La stessa funzione di partizione può essere utilizzata da più tabelle o indici. L'istruzione ALTER PARTITION FUNCTION viene applicata a tutti gli elementi in un'unica transazione.

Convenzioni di sintassi Transact-SQL

Sintassi

  
ALTER PARTITION FUNCTION partition_function_name()  
{   
    SPLIT RANGE ( boundary_value )  
  | MERGE RANGE ( boundary_value )   
} [ ; ]  

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

Argomenti

partition_function_name
Nome della funzione di partizione da modificare.

SPLIT RANGE ( boundary_value )
Aggiunge una partizione alla funzione di partizione. boundary_value determina l'intervallo della nuova partizione e deve essere diverso dagli intervalli limite esistenti della funzione di partizione. In base a boundary_value, il motore di database suddivide in due uno degli intervalli esistenti. Di questi due intervalli, quello con il nuovo boundary_value è la nuova partizione.

È necessario che un filegroup esista online e sia contrassegnato dallo schema di partizione che usa la funzione di partizione come NEXT USED affinché possa contenere la nuova partizione. Un'istruzione CREATE PARTITION SCHEME assegna i filegroup alle partizioni. L'istruzione CREATE PARTITION FUNCTION crea meno partizioni rispetto ai filegroup per contenerli. Un'istruzione CREATE PARTITION SCHEME può riservare più filegroup del necessario. In tal caso, risulteranno filegroup non assegnati. Inoltre, lo schema di partizione contrassegna uno dei filegroup come NEXT USED. Questo filegroup contiene la nuova partizione. Se nessuno dei filegroup viene contrassegnato come NEXT USED dallo schema di partizione, è necessario usare un'istruzione ALTER PARTITION SCHEME.

L'istruzione ALTER PARTITION SCHEME può aggiungere un filegroup oppure selezionarne uno esistente, per contenere la nuova partizione. È possibile assegnare un filegroup che già contiene partizioni in modo da contenere partizioni aggiuntive. Una funzione di partizione può partecipare a più schemi di partizione. Per questo motivo, tutti gli schemi di partizione che usano la funzione di partizione a cui si stanno aggiungendo partizioni devono avere un filegroup NEXT USED. In caso contrario, l'istruzione ALTER PARTITION FUNCTION avrà esito negativo e restituirà un errore indicante che lo schema o gli schemi di partizione non dispongono di un filegroup NEXT USED.

Se si creano tutte le partizioni nello stesso filegroup, quest'ultimo verrà inizialmente assegnato automaticamente al successivo filegroup NEXT USED. Tuttavia, dopo l'esecuzione dell'operazione di divisione, non è più presente un filegroup NEXT USED selezionato. Assegnare in modo esplicito il filegroup come filegroup NEXT USED tramite l'istruzione ALTER PARTITION SCHEME. In caso contrario, le successive operazioni di divisione avranno esito negativo.

Nota

Limitazioni per l'indice columnstore: quando la tabella include un indice columnstore è possibile suddividere solo partizioni vuote. Prima di eseguire questa operazione è necessario eliminare o disabilitare l'indice columnstore.

MERGE [ RANGE ( boundary_value) ]
Elimina una partizione e unisce i valori esistenti in tale partizione in una delle partizioni rimanenti. RANGE (boundary_value) deve essere un valore limite esistente della partizione da eliminare. Questo argomento rimuove il filegroup che originariamente conteneva boundary_value dallo schema di partizione a meno che non sia usato da una partizione rimanente oppure non sia contrassegnato con la proprietà NEXT USED. La partizione unita esiste nel filegroup che non conteneva boundary_value inizialmente. boundary_value è un'espressione costante che può fare riferimento a variabili (incluse le variabili di tipo definito dall'utente) o funzioni (incluse le funzioni definite dall'utente). Non può fare riferimento a espressioni Transact-SQL. boundary_value deve corrispondere al tipo di dati della colonna di partizionamento corrispondente o deve poter essere convertito in modo implicito in tale tipo di dati. Non è inoltre possibile troncare boundary_value durante la conversione implicita in modo che le dimensioni e la scala del valore non corrispondano a quelle del relativo input_parameter_type.

Nota

Limitazioni con l'indice columnstore: non è possibile unire due partizioni non dispendiose contenenti un indice columnstore. Prima di eseguire questa operazione è necessario eliminare o disabilitare l'indice columnstore.

Consigli per iniziare

Mantenere sempre partizioni vuote a entrambe le estremità dell'intervallo di partizione. Mantenere le partizioni a entrambe le estremità consente di garantire che la divisione delle partizioni e l'unione delle partizioni non comportino lo spostamento di dati. La divisione delle partizioni si verifica all'inizio e l'unione delle partizioni si verifica alla fine. Evitare di suddividere o di unire le partizioni popolate, perché tale operazione può risultare estremamente inefficiente, in quanto può causare la generazione di log quattro volte superiori e può provocare anche un blocco grave.

Il motivo principale per cui inserire le partizioni in più filegroup è che in questo modo è possibile eseguire operazioni di backup e ripristino sulle partizioni in modo indipendente. Per altre informazioni sui filegroup e sulle strategie di partizionamento, vedere Filegroup.

Limitazioni e restrizioni

ALTER PARTITION FUNCTION rieseguirà il partizionamento di qualsiasi tabella e indice che utilizza la funzione in una singola operazione atomica. Questa operazione si verifica tuttavia in modalità offline e, in base all'estensione del ripartizionamento, potrebbe richiedere un numero elevato di risorse.

Usare l'istruzione ALTER PARTITION FUNCTION solo per la divisione di una partizione oppure per l'unione di due partizioni. Per modificare il modo in cui una tabella viene partizionata, ad esempio da 10 a cinque partizioni, avvalersi di una delle opzioni seguenti. In base alla configurazione del sistema, l'utilizzo delle risorse potrebbe variare in base all'opzione prescelta:

  • Creare una nuova tabella partizionata con la funzione di partizione necessaria. Inserire quindi i dati della vecchia tabella in quella nuova usando un'istruzione INSERT INTO...SELECT FROM.

  • Creazione di 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.

  • Eseguire una sequenza di istruzioni ALTER PARTITION FUNCTION.

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

L'istruzione ALTER PARTITION FUNCTION ha esito negativo in presenza di un indice cluster disabilitato sulle tabelle che usano la funzione di partizione.

Il motore di database non fornisce il supporto della replica per la modifica di una funzione di partizione. Le modifiche a una funzione di partizione nel database di pubblicazione deve essere applicato manualmente nel database di sottoscrizione.

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.

Esempi

R. Suddividere in due partizioni una partizione di una tabella o un indice partizionato

Nell'esempio seguente viene creata una funzione di partizione per suddividere una tabella o indice in quattro partizioni. ALTER PARTITION FUNCTION suddivide una delle partizioni in due per creare un totale di cinque partizioni.

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. Unire due partizioni di una tabella partizionata

Nell'esempio seguente viene creata la stessa funzione di partizione dell'esempio precedente e quindi due partizioni vengono unite in modo da formare un totale di tre partizioni.

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

Passaggi successivi

Per altre informazioni sul partizionamento delle tabelle e sui concetti correlati, vedere gli articoli seguenti: