Condividi tramite


CREATE PARTITION FUNCTION (Transact-SQL)

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'utilizzo di CREATE PARTITION FUNCTION rappresenta il primo passaggio per la creazione di una tabella o di un indice partizionato. In una tabella o indice di SQL Server 2012 possono essere presenti al massimo 15.000 partizioni.

Icona di collegamento a un argomento Convenzioni della 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), i tipi di dati alias o i tipi 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 di un indice partizionato che utilizza partition_function_name. Se boundary_value è vuoto, la funzione di partizione esegue il mapping dell'intera tabella o dell'intero indice che utilizza partition_function_name in 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. Tale espressione non potrà invece fare riferimento a espressioni Transact-SQL. boundary_value deve corrispondere oppure supportare la conversione implicita 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 o la scala del valore non corrisponda a quella del relativo valore di input_parameter_type.

    [!NOTA]

    Se boundary_value è costituito dal valore letterale datetime o smalldatetime, tale valore viene valutato presupponendo che la lingua di 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.

  • ...n
    Specifica il numero di valori forniti da boundary_value, il massimo è 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, Motore di database li ordina, crea la funzione e restituisce un avviso che informa che i valori non sono in ordine. Viene restituito un errore se n include valori duplicati.

  • LEFT | RIGHT
    Specifica il lato (sinistro o destro) di ogni intervallo di valori limite a cui appartiene boundary_value [ ,...n ], quando i valori dell'intervallo vengono ordinati dal Motore di database in senso 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 assegnata per impostazione predefinita ai membri del ruolo predefinito del server sysadmin e dei 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

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

Nella tabella seguente viene illustrato come verrebbe partizionata una tabella che utilizza questa funzione di partizione nella colonna di partizionamento col1.

Partition

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

Nella funzione di partizione seguente vengono usati gli stessi valori di boundary_value [ ,...n ] dell'esempio precedente, con la differenza che viene specificato RANGE RIGHT.

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

Nella tabella seguente viene illustrato come verrebbe partizionata una tabella che utilizza questa funzione di partizione nella colonna di partizionamento col1.

Partition

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

Nella funzione di partizione seguente viene partizionato un indice o una tabella 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');

Nella tabella seguente viene illustrato come verrebbe partizionato un indice o una tabella che utilizza questa funzione di partizione nella colonna di partizionamento datecol.

Partition

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

Nella tabella seguente viene illustrato come verrebbe partizionata una tabella che utilizza questa funzione di partizione nella colonna di partizionamento col1.

Partition

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 crea 50 partizioni in una tabella o un indice 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

Vedere anche

Riferimento

$PARTITION (Transact-SQL)

ALTER PARTITION FUNCTION (Transact-SQL)

DROP PARTITION FUNCTION (Transact-SQL)

CREATE PARTITION SCHEME (Transact-SQL)

CREATE TABLE (Transact-SQL)

CREATE INDEX (Transact-SQL)

ALTER INDEX (Transact-SQL)

EVENTDATA (Transact-SQL)

sys.partition_functions (Transact-SQL)

sys.partition_parameters (Transact-SQL)

sys.partition_range_values (Transact-SQL)

sys.partitions (Transact-SQL)

sys.tables (Transact-SQL)

sys.indexes (Transact-SQL)

sys.index_columns (Transact-SQL)

Concetti

Tabelle e indici partizionati