ALTER PARTITION FUNCTION (Transact-SQL)ALTER PARTITION FUNCTION (Transact-SQL)

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2008)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Modifica una funzione di partizione mediante la suddivisione o l'unione dei relativi valori limite.Alters a partition function by splitting or merging its boundary values. 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.By executing ALTER PARTITION FUNCTION, one partition of any table or index that uses the partition function can be split into two partitions, or two partitions can be merged into one less partition.

Attenzione

La stessa funzione di partizione può essere utilizzata da più tabelle o indici.More than one table or index can use the same partition function. L'istruzione ALTER PARTITION FUNCTION viene applicata a tutti gli elementi in un'unica transazione.ALTER PARTITION FUNCTION affects all of them in a single transaction.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax


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

ArgomentiArguments

partition_function_namepartition_function_name
Nome della funzione di partizione da modificare.Is the name of the partition function to be modified.

SPLIT RANGE ( boundary_value )SPLIT RANGE ( boundary_value )
Aggiunge una partizione alla funzione di partizione.Adds one partition to the partition function. boundary_value determina l'intervallo della nuova partizione e deve essere diverso dagli intervalli limite esistenti della funzione di partizione.boundary_value determines the range of the new partition, and must differ from the existing boundary ranges of the partition function. In base a boundary_value, il Motore di databaseDatabase Engine suddividerà in due uno degli intervalli esistenti.Based on boundary_value, the Motore di databaseDatabase Engine splits one of the existing ranges into two. L'intervallo in cui si trova il nuovo boundary_value verrà considerato la nuova partizione.Of these two, the one where the new boundary_value resides is considered the new partition.

È 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.A filegroup must exist online and be marked by the partition scheme that uses the partition function as NEXT USED to hold the new partition. Per allocare i filegroup alle partizioni è necessario utilizzare un'istruzione CREATE PARTITION SCHEME.Filegroups are allocated to partitions in a CREATE PARTITION SCHEME statement. 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 partizioneIf a CREATE PARTITION SCHEME statement allocates more filegroups than necessary (fewer partitions are created in the CREATE PARTITION FUNCTION statement than filegroups to hold them), then there are unassigned filegroups, and one of them is marked NEXT USED by the partition scheme. conterrà la nuova partizione.This filegroup will hold the new partition. 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.If there are no filegroups marked NEXT USED by the partition scheme, you must use ALTER PARTITION SCHEME to either add a filegroup, or designate an existing one, to hold the new partition. Un filegroup che già include partizioni può essere configurato in modo da contenere partizioni aggiuntive.A filegroup that already holds partitions can be designated to hold additional partitions. 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.Because a partition function can participate in more than one partition scheme, all the partition schemes that use the partition function to which you are adding partitions must have a NEXT USED filegroup. 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.Otherwise, ALTER PARTITION FUNCTION fails with an error that displays the partition scheme or schemes that lack a NEXT USED filegroup.

Se si creano tutte le partizioni nello stesso filegroup, quest'ultimo verrà inizialmente assegnato automaticamente al successivo filegroup NEXT USED.If you create all the partitions in the same filegroup, that filegroup is initially assigned to be the NEXT USED filegroup automatically. Tuttavia, dopo l'esecuzione dell'operazione di divisione, non sarà più presente un filegroup NEXT USED designato.However, after a split operation is performed, there is no longer a designated NEXT USED filegroup. È 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.You must explicitly assign the filegroup to be the NEXT USED filegroup by using ALTER PARITION SCHEME or a subsequent split operation will fail.

Nota

Limitazioni per l'indice columnstore: quando la tabella include un indice columnstore è possibile suddividere solo partizioni vuote.Limitations with columnstore index: Only empty partitions can be split in when a columnstore index exists on the table. Prima di eseguire questa operazione è necessario eliminare o disabilitare l'indice columnstore.You will need to drop or disable the columnstore index before performing this operation

MERGE [ RANGE ( boundary_value) ]MERGE [ RANGE ( boundary_value) ]
Elimina una partizione e unisce i valori esistenti in tale partizione in una delle rimanenti partizioni.Drops a partition and merges any values that exist in the partition into one of the remaining partitions. RANGE (boundary_value) deve essere un valore limite esistente nel quale vengono uniti i valori della partizione eliminata.RANGE (boundary_value) must be an existing boundary value, into which the values from the dropped partition are merged. Il filegroup che originariamente conteneva boundary_value viene rimosso dallo schema di partizione a meno che non sia usato da una partizione rimanente oppure non sia contrassegnato dalla proprietà NEXT USED.The filegroup that originally held boundary_value is removed from the partition scheme unless it is used by a remaining partition, or is marked with the NEXT USED property. La partizione unita si trova nel filegroup che originariamente non conteneva boundary_value.The merged partition resides in the filegroup that originally did not hold boundary_value. 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).boundary_value is a constant expression that can reference variables (including user-defined type variables) or functions (including user-defined functions). Non potrà invece fare riferimento a un'espressione Transact-SQLTransact-SQL.It cannot reference a Transact-SQLTransact-SQL expression. boundary_value deve corrispondere o essere convertibile in modo implicito nel tipo di dati della colonna di partizionamento corrispondente e non può essere troncato durante la conversione implicita in un modo tale che la dimensione e la scala del valore non corrispondano a quelle del valore input_parameter_type corrispondente.boundary_value must either match or be implicitly convertible to the data type of its corresponding partitioning column, and cannot be truncated during implicit conversion in a way that the size and scale of the value does not match that of its corresponding input_parameter_type.

Nota

Limitazioni per l'indice columnstore: non è possibile unire due partizioni non vuote contenenti un indice columnstore.Limitations with columnstore index: Two nonempty partitions containing a columnstore index cannot be merged. Prima di eseguire questa operazione è necessario eliminare o disabilitare l'indice columnstore.You will need to drop or disable the columnstore index before performing this operation

Procedure consigliateBest Practices

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.Always keep empty partitions at both ends of the partition range to guarantee that the partition split (before loading new data) and partition merge (after unloading old data) do not incur any data movement. Evitare di suddividere o di unire le partizioni popolate,Avoid splitting or merging populated partitions. 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.This can be extremely inefficient, as this may cause as much as four times more log generation, and may also cause severe locking.

Limitazioni e restrizioniLimitations and Restrictions

ALTER PARTITION FUNCTION rieseguirà il partizionamento di qualsiasi tabella e indice che utilizza la funzione in una singola operazione atomica.ALTER PARTITION FUNCTION repartitions any tables and indexes that use the function in a single atomic operation. Questa operazione si verifica tuttavia in modalità offline e, in base all'estensione del ripartizionamento, potrebbe richiedere un numero elevato di risorse.However, this operation occurs offline, and depending on the extent of repartitioning, may be resource-intensive.

L'istruzione ALTER PARTITION FUNCTION può essere utilizzata solo per la suddivisione di una partizione oppure per l'unione di due partizioni.ALTER PARTITION FUNCTION can only be used for splitting one partition into two, or merging two partitions into one. Per modificare il modo in cui una tabella viene partizionata, ad esempio da 10 a 5 partizioni, è possibile avvalersi di una delle opzioni seguenti.To change the way a table is otherwise partitioned (for example, from 10 partitions to 5 partitions), you can exercise any of the following options. In base alla configurazione del sistema, l'utilizzo delle risorse varia in base all'opzione adottata.Depending on the configuration of your system, these options can vary in resource consumption:

  • 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.Create a new partitioned table with the desired partition function, and then insert the data from the old table into the new table by using an INSERT INTO...SELECT FROM statement.

  • Creazione di un indice cluster partizionato su un heap.Create a partitioned clustered index on a heap.

    Nota

    L'eliminazione di un indice cluster partizionato ha come risultato un heap partizionato.Dropping a partitioned clustered index results in a partitioned heap.

  • Eliminazione e ricompilazione di un indice partizionato esistente mediante l'utilizzo dell'istruzione Transact-SQLTransact-SQL CREATE INDEX con la clausola DROP EXISTING = ON.Drop and rebuild an existing partitioned index by using the Transact-SQLTransact-SQL CREATE INDEX statement with the DROP EXISTING = ON clause.

  • Esecuzione di una sequenza di istruzioni ALTER PARTITION FUNCTION.Perform a sequence of ALTER PARTITION FUNCTION statements.

    Tutti i filegroup interessati dall'istruzione ALTER PARTITION FUNCTION devono essere online.All filegroups that are affected by ALTER PARITITION FUNCTION must be online.

    L'istruzione ALTER PARTITION FUNCTION ha esito negativo in presenza di un indice cluster disabilitato sulle tabelle che utilizzano la funzione di partizione.ALTER PARTITION FUNCTION fails when there is a disabled clustered index on any tables that use the partition function.

    SQL ServerSQL Server non fornisce il supporto di replica per la modifica di una funzione di partizione. does not provide replication support for modifying a partition function. Le modifiche a una funzione di partizione nel database di pubblicazione deve essere applicato manualmente nel database di sottoscrizione.Changes to a partition function in the publication database must be manually applied in the subscription database.

AutorizzazioniPermissions

Per eseguire l'istruzione ALTER PARTITION FUNCTION, è necessario utilizzare le autorizzazioni seguenti:Any one of the following permissions can be used to execute ALTER PARTITION FUNCTION:

  • Autorizzazione ALTER ANY DATASPACE.ALTER ANY DATASPACE permission. Questa autorizzazione viene concessa per impostazione predefinita al ruolo predefinito del server sysadmin e ai ruoli predefiniti del database db_owner e db_ddladmin .This permission defaults to members of the sysadmin fixed server role and the db_owner and db_ddladmin fixed database roles.

  • Autorizzazione CONTROL o ALTER nel database in cui la funzione di partizione è stata creata.CONTROL or ALTER permission on the database in which the partition function was created.

  • Autorizzazione CONTROL SERVER o ALTER ANY DATABASE nel server del database in cui la funzione di partizione è stata creata.CONTROL SERVER or ALTER ANY DATABASE permission on the server of the database in which the partition function was created.

EsempiExamples

A.A. Suddivisione in due partizioni di una partizione di una tabella o un indice partizionatoSplitting a partition of a partitioned table or index into two partitions

Nell'esempio seguente viene creata una funzione di partizione per suddividere una tabella o indice in quattro partizioni.The following example creates a partition function to partition a table or index into four partitions. ALTER PARTITION FUNCTION suddivide una delle partizioni in due per creare un totale di cinque partizioni.ALTER PARTITION FUNCTION splits one of the partitions into two to create a total of five partitions.

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.B. Unione di due partizioni di una tabella partizionataMerging two partitions of a partitioned table into one partition

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.The following example creates the same partition function as above, and then merges two of the partitions into one partition, for a total of three partitions.

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 ancheSee Also

Tabelle e indici partizionati Partitioned Tables and Indexes
CREATE PARTITION FUNCTION (Transact-SQL) CREATE PARTITION FUNCTION (Transact-SQL)
DROP PARTITION FUNCTION (Transact-SQL) DROP PARTITION FUNCTION (Transact-SQL)
CREATE PARTITION SCHEME (Transact-SQL) CREATE PARTITION SCHEME (Transact-SQL)
ALTER PARTITION SCHEME (Transact-SQL) ALTER PARTITION SCHEME (Transact-SQL)
DROP PARTITION SCHEME (Transact-SQL) DROP PARTITION SCHEME (Transact-SQL)
CREATE INDEX (Transact-SQL) CREATE INDEX (Transact-SQL)
ALTER INDEX (Transact-SQL) ALTER INDEX (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
sys.partition_functions (Transact-SQL) sys.partition_functions (Transact-SQL)
sys.partition_parameters (Transact-SQL) sys.partition_parameters (Transact-SQL)
sys.partition_range_values (Transact-SQL) sys.partition_range_values (Transact-SQL)
sys.partitions (Transact-SQL) sys.partitions (Transact-SQL)
sys.tables (Transact-SQL) sys.tables (Transact-SQL)
sys.indexes (Transact-SQL) sys.indexes (Transact-SQL)
sys.index_columns (Transact-SQL)sys.index_columns (Transact-SQL)