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

SI APPLICA A: sìSQL Server (a partire dalla versione 2008) sìDatabase SQL di Azure noAzure SQL Data Warehouse noParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure 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. L'esecuzione di un'istruzione ALTER PARTITION FUNCTION può causare la suddivisione in due partizioni di una partizione di tabella o un indice che usa la funzione di partizione.Running an ALTER PARTITION FUNCTION statement can split one table partition or index that uses the partition function into two partitions. L'istruzione può anche unire due partizioni in un'unica partizione.The statement can also merge two partitions 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. Di questi due gli intervalli, quello con il nuovo boundary_value è la nuova partizione.Of these two ranges, the one with the new boundary_value is the new partition.

È necessario che un filegroup esista onlineA filegroup must exist online. e sia contrassegnato dallo schema di partizione che usa la funzione di partizione come NEXT USED affinché possa contenere la nuova partizione.And, the partition scheme that uses the partition function as NEXT USED to hold the new partition must mark the filegroup. Un'istruzione CREATE PARTITION SCHEME assegna i filegroup alle partizioni.A CREATE PARTITION SCHEME statement assigns filegroups to partitions. L'istruzione CREATE PARTITION FUNCTION crea meno partizioni rispetto ai filegroup per contenerli.The CREATE PARTITION FUNCTION statement creates fewer partitions than filegroups to hold them. Un'istruzione CREATE PARTITION SCHEME può riservare più filegroup del necessario.A CREATE PARTITION SCHEME statement may set aside more filegroups than needed. In tal caso, risulteranno filegroup non assegnati.If that happens, then you'll end up with unassigned filegroups. Inoltre, lo schema di partizione contrassegna uno dei filegroup come NEXT USED.Also, the partition scheme marks one of the filegroups as NEXT USED. Questo filegroup contiene la nuova partizione.This filegroup holds the new partition. Se nessuno dei filegroup viene contrassegnato come NEXT USED dallo schema di partizione, è necessario usare un'istruzione ALTER PARTITION SCHEME.If there are no filegroups the partition scheme marks as NEXT USED, you must use an ALTER PARTITION SCHEME statement.

L'istruzione ALTER PARTITION SCHEME può aggiungere un filegroup oppure selezionarne uno esistente, per contenere la nuova partizione.The ALTER PARTITION SCHEME statement can either add a filegroup, or select an existing one, to hold the new partition. È possibile assegnare un filegroup che già contiene partizioni in modo da contenere partizioni aggiuntive.You can assign a filegroup that already holds partitions to hold additional partitions. Una funzione di partizione può partecipare a più schemi di partizione.A partition function can participate in more than one partition scheme. 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.For this reason, all the partition schemes that use the partition function to which you're 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, the ALTER PARTITION FUNCTION statement 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 è più presente un filegroup NEXT USED selezionato.However, after a split operation runs, there's no longer a selected NEXT USED filegroup. 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.Explicitly assign the filegroup as the NEXT USED filegroup by using ALTER PARTITION SCHEME or an upcoming split operation will fail.

Nota

Limitazioni per l'indice columnstore: quando la tabella include un indice columnstore è possibile dividere solo le 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 a remaining partition. 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. 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.This argument removes the filegroup that originally held boundary_value from the partition scheme unless a remaining partition uses it, or marks it with the NEXT USED property. La partizione unita esiste nel filegroup che non conteneva boundary_value inizialmente.The merged partition exists in the filegroup that didn't hold boundary_value at first. 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 può fare riferimento a un'espressione Transact-SQLTransact-SQL.It can't reference a Transact-SQLTransact-SQL expression. 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.boundary_value must either match or be implicitly convertible to the data type of its corresponding partitioning column. 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.You also can't truncate boundary_value during implicit conversion in a way that the size and scale of the value doesn't match that of its corresponding input_parameter_type.

Nota

Limitazioni per l'indice columnstore: Due partizioni non vuote contenenti un indice columnstore non possono essere unite.Limitations with columnstore index: Two nonempty partitions containing a columnstore index can't 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 a entrambe le estremità dell'intervallo di partizione.Always keep empty partitions at both ends of the partition range. 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.Keep the partitions at both ends to guarantee that the partition split and the partition merge don't incur any data movement. La divisione delle partizioni si verifica all'inizio e l'unione delle partizioni si verifica alla fine.The partition split occurs at the beginning and the partition merge occurs at the end. Evitare di suddividere o di unire le partizioni popolate,Avoid splitting or merging populated partitions. perché tale operazione può risultare estremamente inefficiente,Splitting or merging populated partitions can be inefficient. in quanto può causare la generazione di log quattro volte superiori e può provocare anche un blocco grave.They can be inefficient because the split or merge 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.

Usare l'istruzione ALTER PARTITION FUNCTION solo per la divisione di una partizione oppure per l'unione di due partizioni.Only use ALTER PARTITION FUNCTION 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 cinque partizioni, avvalersi di una delle opzioni seguenti.To change the way a table is otherwise partitioned (for example, from 10 partitions to five partitions), exercise any of the following options. In base alla configurazione del sistema, l'utilizzo delle risorse potrebbe variare in base all'opzione prescelta:Depending on the configuration of your system, these options may vary in resource consumption:

  • Creare una nuova tabella partizionata con la funzione di partizione necessaria.Create a new partitioned table with the necessary partition function. Inserire quindi i dati della vecchia tabella in quella nuova usando un'istruzione INSERT INTO...SELECT FROM.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.

  • Eseguire una sequenza di istruzioni ALTER PARTITION FUNCTION.Run 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 PARTITION FUNCTION must be online.

L'istruzione ALTER PARTITION FUNCTION ha esito negativo in presenza di un indice cluster disabilitato sulle tabelle che usano la funzione di partizione.ALTER PARTITION FUNCTION fails when a disabled clustered index exists 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.doesn't 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.

PermissionsPermissions

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_range_values (Transact-SQL) sys.partition_parameters (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)