ALTER PARTITION FUNCTION (Transact-SQL)
Modifica una funzione di partizione mediante la suddivisione o l'unione dei relativi valori limite. Se si esegue ALTER PARTITION FUNCTION, una partizione di una tabella o un indice qualsiasi che utilizza la funzione di partizione può essere suddivisa in due partizioni oppure due partizioni possono essere unite 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 della sintassi Transact-SQL
Sintassi
ALTER PARTITION FUNCTION partition_function_name()
{
SPLIT RANGE ( boundary_value )
| MERGE RANGE ( boundary_value )
} [ ; ]
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, Motore di database suddividerà uno degli intervalli esistenti. L'intervallo in cui si trova il nuovo valore definito da boundary_value verrà considerato la nuova partizione.È necessario che un filegroup esista online e sia contrassegnato dallo schema di partizione che utilizza la funzione di partizione come NEXT USED affinché possa contenere la nuova partizione. Per allocare i filegroup alle partizioni è necessario utilizzare un'istruzione CREATE PARTITION SCHEME. Se un'istruzione CREATE PARTITION SCHEME alloca un numero di filegroup maggiore del necessario, ovvero l'istruzione CREATE PARTITION FUNCTION crea un numero di partizioni inferiore rispetto al numero di filegroup disponibili, saranno presenti filegroup non assegnati e quello che verrà contrassegnato come NEXT USED dallo schema di partizione conterrà la nuova partizione. Se non sono presenti filegroup contrassegnati come NEXT USED dallo schema di partizione, è necessario utilizzare l'istruzione ALTER PARTITION SCHEME per aggiungere un filegroup oppure per designarne uno esistente per contenere la nuova partizione. Un filegroup che già include partizioni può essere configurato in modo da contenere partizioni aggiuntive. Poiché una funzione di partizione può essere inclusa in più schemi di partizione, tutti gli schemi di partizione che utilizzano tale funzione di partizione a cui si sta aggiungendo partizioni devono disporre di 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 sarà più presente un filegroup NEXT USED designato. È necessario assegnare in modo esplicito il filegroup come filegroup NEXT USED tramite l'istruzione ALTER PARTITION SCHEME, diversamente le successive operazioni di divisione avranno esito negativo.
MERGE [ RANGE ( boundary_value) ]
Elimina una partizione e unisce i valori esistenti in tale partizione in una delle rimanenti partizioni. RANGE (boundary_value) deve essere un valore limite esistente nel quale verranno uniti i valori della partizione eliminata. Il filegroup che originariamente contiene boundary_value viene rimosso dallo schema di partizione a meno che non sia utilizzato da una partizione rimanente oppure non sia contrassegnato tramite la proprietà NEXT USED. La partizione unita si trova nel filegroup che originalmente non conteneva boundary_value. boundary_value è un'espressione costante che può fare riferimento a variabili (incluse variabili di tipo definito dall'utente) o funzioni (incluse funzioni definite dall'utente). Non potrà invece fare riferimento a un'espressione Transact-SQL. boundary_value deve corrispondere oppure supportare la conversione implicita nel tipo di dati della colonna di partizionamento corrispondente e non può essere troncato durante la conversione implicita in modo tale che la dimensione o la scala del valore non corrisponda a quella del relativo valore di input_parameter_type.
Procedure consigliate
Mantenere sempre partizioni vuote in entrambe le estremità dell'intervallo di partizione per garantire che la divisione delle partizioni (prima del caricamento di nuovi dati) e l'unione delle partizioni (dopo lo scaricamento di dati non aggiornati) non provochino uno spostamento dei dati. Evitare di suddividere o di unire le partizioni popolate, poiché tale operazione può risultare estremamente inefficiente, in quanto può causare la generazione di log quattro volte superiori e può provocare anche un blocco grave.
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.
L'istruzione ALTER PARTITION FUNCTION può essere utilizzata solo per la suddivisione 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 5 partizioni, è possibile avvalersi di una delle opzioni seguenti. In base alla configurazione del sistema, l'utilizzo delle risorse varia in base all'opzione adottata.
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.
Creazione di un indice cluster partizionato su un heap.
[!NOTA]
L'eliminazione di un indice cluster partizionato ha come risultato un heap partizionato.
Eliminazione e ricompilazione di un indice partizionato esistente mediante l'utilizzo dell'istruzione Transact-SQL CREATE INDEX con la clausola DROP EXISTING = ON.
Esecuzione di 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 utilizzano la funzione di partizione.
SQL Server non fornisce il supporto di 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 per il server del database nel quale viene creata la funzione di partizione.
Esempi
A.Suddivisione in due partizioni di 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.Unione di 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);
Vedere anche
Riferimento
CREATE PARTITION FUNCTION (Transact-SQL)
DROP PARTITION FUNCTION (Transact-SQL)
CREATE PARTITION SCHEME (Transact-SQL)
ALTER PARTITION SCHEME (Transact-SQL)
DROP PARTITION SCHEME (Transact-SQL)
sys.partition_functions (Transact-SQL)
sys.partition_parameters (Transact-SQL)
sys.partition_range_values (Transact-SQL)
sys.index_columns (Transact-SQL)