CREATE PARTITION FUNCTION (Transact-SQL)

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

Crea una funzione nel database corrente che esegue il mapping delle righe di una tabella o di un indice in partizioni in base ai valori della colonna specificata. L'uso di CREATE PARTITION FUNCTION è il primo passaggio per la creazione di una tabella o un indice partizionato. Una tabella o un indice può contenere al massimo 15.000 partizioni.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type )  
AS RANGE [ LEFT | RIGHT ]   
FOR VALUES ( [ boundary_value [ ,...n ] ] )   
[ ; ]  

Argomenti

partition_function_name
Nome della funzione di partizione. I nomi delle funzioni di partizione devono essere univoci nel database e devono essere conformi alle regole per gli identificatori.

input_parameter_type
Tipo di dati della colonna usata per il partizionamento. Come colonne di partizionamento possono essere usati tutti i tipi di dati tranne text, ntext, image, xml, timestamp, varchar(max), nvarchar(max), varbinary(max), tipi di dati alias o tipi di dati CLR definiti dall'utente.

La colonna effettiva, ovvero la colonna di partizionamento, è specificata nell'istruzione CREATE TABLE o CREATE INDEX.

boundary_value
Specifica i valori limite per ogni partizione di una tabella o un indice partizionato che usa partition_function_name. Se boundary_value viene lasciato vuoto, la funzione di partizione esegue il mapping dell'intera tabella o dell'intero indice tramite partition_function_name su un'unica partizione. È possibile usare una sola colonna di partizionamento, specificata in un'istruzione CREATE TABLE o CREATE INDEX.

boundary_value è un'espressione costante che può fare riferimento a variabili, incluse variabili di tipi definiti dall'utente o funzioni e funzioni definite dall'utente. Non può fare riferimento a espressioni Transact-SQL. boundary_value deve corrispondere o essere convertibile in modo implicito nel tipo di dati specificato in input_parameter_type 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.

Nota

Se boundary_value è costituito dal valore letterale datetime o smalldatetime, questo valore viene valutato presupponendo che la lingua della sessione sia us_english. Questo comportamento è deprecato. Per garantire che la definizione della funzione di partizione funzioni nel modo previsto per tutte le lingue di sessione, è consigliabile usare costanti interpretate nello stesso modo per le impostazioni di tutte le lingue, ad esempio il formato aaaammgg, oppure convertire esplicitamente i valori letterali in uno stile specifico. Per determinare la lingua di sessione del server, eseguire SELECT @@LANGUAGE.

Per altre informazioni, vedere Conversione non deterministica di stringhe di valori letterali in valori DATE.

...n
Specifica il numero di valori forniti da boundary_value che non deve superare 14.999. Il numero di partizioni create è uguale a n + 1. Non è necessario elencare i valori in ordine. Se i valori non sono in ordine, il motore di database li ordina, crea la funzione e restituisce un avviso che informa che i valori non sono stati forniti in ordine. Il motore di database restituisce un errore se n include valori duplicati.

LEFT | RIGHT
Specifica il lato (sinistro o destro) di ogni intervallo di valori limite a cui appartieneboundary_value [ ,...n ] quando i valori dell'intervallo vengono ordinati dal motore di database in ordine crescente da sinistra a destra. Se omesso, il valore predefinito è LEFT.

Osservazioni:

L'ambito di una funzione di partizione è limitato al database in cui la funzione viene creata. All'interno del database le funzioni di partizione si trovano in uno spazio dei nomi separato rispetto alle funzioni.

Tutte le righe la cui colonna di partizionamento contiene valori NULL vengono inserite nella prima partizione a sinistra, a meno che non sia specificato NULL come valore limite e indicato RIGHT. In questo caso la prima partizione a sinistra sarà una partizione vuota e i valori NULL verranno inseriti nella partizione successiva.

Autorizzazioni

Per eseguire CREATE PARTITION FUNCTION è possibile usare qualsiasi delle 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 per il database in cui viene creata la funzione di partizione.

  • Autorizzazione CONTROL SERVER o ALTER ANY DATABASE per il server del database in cui viene creata la funzione di partizione.

Esempi

R. Creazione di una funzione di partizione RANGE LEFT in una colonna int

La funzione di partizione seguente crea quattro partizioni in una tabella o un indice.

CREATE PARTITION FUNCTION myRangePF1 (int)  
AS RANGE LEFT FOR VALUES (1, 100, 1000);  

La tabella seguente illustra come viene suddivisa una tabella che usa questa funzione di partizione nella colonna di partizionamento col1.

Partizione 1 2 3 4
Valori col1<= 1 col1>1 AND col1<= 100 col1>100 AND col1<=1000 col1>1000

B. Creazione di una funzione di partizione RANGE RIGHT in una colonna int

La funzione di partizione seguente usa gli stessi valori di boundary_value [ ,...n ] dell'esempio precedente, con la differenza che qui specifica RANGE RIGHT.

CREATE PARTITION FUNCTION myRangePF2 (int)  
AS RANGE RIGHT FOR VALUES (1, 100, 1000);  

La tabella seguente illustra come viene suddivisa una tabella che usa questa funzione di partizione nella colonna di partizionamento col1.

Partizione 1 2 3 4
Valori col1<1 col1>= 1 AND col1<100 col1>= 100 AND col1<1000 col1>= 1000

C. Creazione di una funzione di partizione RANGE RIGHT in una colonna datetime

La funzione di partizione seguente suddivide una tabella o un indice in 12 partizioni, una per ogni mese dei valori di un anno in una colonna datetime.

CREATE PARTITION FUNCTION [myDateRangePF1] (datetime)  
AS RANGE RIGHT FOR VALUES ('20030201', '20030301', '20030401',  
               '20030501', '20030601', '20030701', '20030801',   
               '20030901', '20031001', '20031101', '20031201');  

La tabella seguente illustra come viene suddivisa una tabella o un indice che usa questa funzione di partizione nella colonna di partizionamento datecol.

Partizione 1 2 ... 11 12
Valori datecol<February 1, 2003 datecol>= February 1, 2003 AND datecol<March 1, 2003 datecol>= November 1, 2003 AND col1<December 1, 2003 datecol>= December 1, 2003

D. Creazione di una funzione di partizione in una colonna char

La funzione di partizione seguente crea quattro partizioni in una tabella o un indice.

CREATE PARTITION FUNCTION myRangePF3 (char(20))  
AS RANGE RIGHT FOR VALUES ('EX', 'RXE', 'XR');  

La tabella seguente illustra come viene suddivisa una tabella che usa questa funzione di partizione nella colonna di partizionamento col1.

Partizione 1 2 3 4
Valori col1<EX... col1>= EX AND col1<RXE... col1>= RXE AND col1<XR... col1>= XR

E. Creazione di 15.000

La funzione di partizione seguente crea 15.000 partizioni in una tabella o un indice.

--Create integer partition function for 15,000 partitions.  
DECLARE @IntegerPartitionFunction nvarchar(max) = 
    N'CREATE PARTITION FUNCTION IntegerPartitionFunction (int) 
    AS RANGE RIGHT FOR VALUES (';  
DECLARE @i int = 1;  
WHILE @i < 14999  
BEGIN  
SET @IntegerPartitionFunction += CAST(@i as nvarchar(10)) + N', ';  
SET @i += 1;  
END  
SET @IntegerPartitionFunction += CAST(@i as nvarchar(10)) + N');';  
EXEC sp_executesql @IntegerPartitionFunction;  
GO  

F. Creazione di partizioni per più anni

La funzione di partizione seguente suddivide una tabella o un indice in 50 partizioni in una colonna datetime2. È presente una partizione per ogni mese tra gennaio 2007 e gennaio 2011.

--Create date partition function with increment by month.  
DECLARE @DatePartitionFunction nvarchar(max) = 
    N'CREATE PARTITION FUNCTION DatePartitionFunction (datetime2) 
    AS RANGE RIGHT FOR VALUES (';  
DECLARE @i datetime2 = '20070101';  
WHILE @i < '20110101'  
BEGIN  
SET @DatePartitionFunction += '''' + CAST(@i as nvarchar(10)) + '''' + N', ';  
SET @i = DATEADD(MM, 1, @i);  
END  
SET @DatePartitionFunction += '''' + CAST(@i as nvarchar(10))+ '''' + N');';  
EXEC sp_executesql @DatePartitionFunction;  
GO  

Passaggi successivi

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