CREATE PARTITION FUNCTION (Transact-SQL)

Anwendungsbereich: JaSQL Server (alle unterstützten Versionen) JaAzure SQL-Datenbank

Erstellt eine Funktion in der aktuellen Datenbank, die Zeilen einer Tabelle oder eines Indexes Partitionen zuordnet. Dies erfolgt auf Grundlage der Werte einer angegebenen Spalte. Das Verwenden von CREATE PARTITION FUNCTION ist der erste Schritt beim Erstellen einer partitionierten Tabelle oder eines partitionierten Index. Eine Tabelle oder ein Index in SQL Server kann maximal 15.000 Partitionen aufweisen.

Symbol für Themenlink Transact-SQL-Syntaxkonventionen

Syntax

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

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 oder früher finden Sie unter Dokumentation zu früheren Versionen.

Argumente

partition_function_name
Der Name der Partitionsfunktion. Partitionsfunktionsnamen müssen innerhalb der Datenbank eindeutig sein und den Regeln für Bezeichner entsprechen.

input_parameter_type
Der Datentyp der zum Partitionieren verwendeten Spalte. Als Partitionierungsspalte sind alle Datentypen außer text, ntext, image, xml, timestamp, varchar(max), nvarchar(max), varbinary(max), Aliasdatentypen oder CLR-benutzerdefinierten Datentypen, zulässig.

Die eigentliche Spalte, Partitionierungsspalte genannt, wird in der CREATE TABLE- oder CREATE INDEX-Anweisung angegeben.

boundary_value
Gibt die Grenzwerte für jede Partition einer partitionierten Tabelle oder eines partitionierten Index an, die bzw. der partition_function_name verwendet. Wenn boundary_value leer bleibt, ordnet die Partitionsfunktion die gesamte Tabelle oder den gesamten Index mithilfe von partition_function_name einer Partition zu. Nur eine einzige, in einer CREATE TABLE- oder CREATE INDEX-Anweisung angegebene Partitionierungsspalte kann verwendet werden.

boundary_value ist ein konstanter Ausdruck, der auf Variablen verweisen kann. Dazu gehören Variablen des benutzerdefinierten Typs oder Funktionen und benutzerdefinierte Funktionen. Er kann nicht auf Transact-SQL-Ausdrücke verweisen. boundary_value muss entweder mit dem in input_parameter_type enthaltenen Datentyp übereinstimmen oder implizit in diesen konvertiert werden. Während der impliziten Konvertierung kann der Wert nicht so abgeschnitten werden, dass dessen Größe und Dezimalstellen mit denen des entsprechenden input_parameter_type-Werts nicht übereinstimmen.

Hinweis

Wenn boundary_value aus den Literalen datetime oder smalldatetime besteht, werden diese Literale ausgewertet, wobei angenommen wird, dass us_english die Sitzungssprache darstellt. Dieses Verhalten ist als veraltet markiert. Wenn Sie sicherstellen möchten, dass sich die Definition der Partitionsfunktion für alle Sitzungssprachen wie erwartet verhält, wird empfohlen, dass Sie die Konstanten verwenden, die für alle Sprachen gleich interpretiert werden, z. B. das Format yyyymmdd, oder dass Sie die Literale explizit in ein bestimmtes Format konvertieren. Führen Sie SELECT @@LANGUAGE aus, um die Sitzungssprache des Servers zu bestimmen.

Weitere Informationen finden Sie unter Nicht deterministische Konvertierung von Datumsliteralzeichenfolgen in DATE-Werte.

...n
Gibt die Anzahl der von boundary_value bereitgestellten Werte an, wobei 14.999 nicht überschritten werden darf. Die Anzahl der erstellten Partitionen entspricht n + 1. Die Werte müssen nicht der Reihenfolge nach angegeben werden. Wenn die Werte nicht der Reihenfolge nach aufgeführt sind, werden sie von Datenbank-Engine sortiert, die Funktion wird erstellt und eine Warnung zurückgegeben, die besagt, dass die Werte nicht der Reihenfolge nach bereitgestellt werden. Die Datenbank-Engine gibt einen Fehler zurück, wenn n doppelte Werte enthält.

LEFT | RIGHT
Gibt an, zu welcher Seite, links oder rechts, die einzelnen Grenzwertintervalle boundary_value [ , ...n ] gehören, wenn Intervallwerte von Datenbank-Engine in aufsteigender Reihenfolge von links nach rechts sortiert werden. Fehlt die Angabe, ist LEFT der Standardwert.

Bemerkungen

Der Bereich einer Partitionsfunktion beschränkt sich auf die Datenbank, in der sie erstellt wird. Innerhalb der Datenbank befinden sich Partitionsfunktionen in einem von anderen Funktionen abgetrennten Namespace.

Jede Zeile, deren Partitionierungsspalte NULL-Werte enthält, wird in die Partition ganz links platziert, es sei denn, NULL wurde als Grenzwert angegeben, und RIGHT wird angezeigt. In diesem Fall ist die Partition ganz links eine leere Partition, und NULL-Werte werden in die sich anschließende Partition platziert.

Berechtigungen

Jede der folgenden Berechtigungen kann zum Ausführen von CREATE PARTITION FUNCTION verwendet werden:

  • ALTER ANY DATASPACE-Berechtigung. Diese Berechtigung gilt standardmäßig für Mitglieder der festen Serverrolle sysadmin und für Mitglieder der festen Datenbankrollen db_owner und db_ddladmin .

  • CONTROL- oder ALTER-Berechtigung für die Datenbank, in der die Partitionsfunktion erstellt wird.

  • CONTROL SERVER- oder ALTER ANY DATABASE-Berechtigung für die Datenbank, in der die Partitionsfunktion erstellt wird.

Beispiele

A. Erstellen einer RANGE LEFT-Partitionsfunktion für eine int-Spalte

Mit der folgenden Partitionsfunktion wird eine Tabelle oder ein Index in vier Partitionen partitioniert.

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

In der folgenden Tabelle wird gezeigt, wie eine Tabelle, die diese Partitionsfunktion auf der Partitionierungsspalte col1 verwendet, partitioniert würde.

Partition 1 2 3 4
Werte col1 <= 1 col1 > 1 AND col1 <= 100 col1 > 100 AND col1 <=1000 col1 > 1000

B. Erstellen einer RANGE RIGHT-Partitionsfunktion für eine int-Spalte

In der folgenden Partitionsfunktion werden dieselben Werte für boundary_value [ , ...n ] wie in der Partitionsfunktion im vorherigen Beispiel verwendet, mit dem Unterschied, dass RANGE RIGHT angegeben wird.

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

In der folgenden Tabelle wird gezeigt, wie eine Tabelle, die diese Partitionsfunktion auf der Partitionierungsspalte col1 verwendet, partitioniert würde.

Partition 1 2 3 4
Werte col1 < 1 col1 >= 1 UND col1 < 100 col1 >= 100 UND col1<1000 col1 >= 1000

C. Erstellen einer RANGE RIGHT-Partitionsfunktion für eine datetime-Spalte

Die folgende Partitionsfunktion partitioniert eine Tabelle oder einen Index in 12 Partitionen, d.h. eine für die Menge an Werten eines jeden Monats des Jahres in einer datetime-Spalte.

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

In der folgenden Tabelle wird dargestellt, wie eine Tabelle oder ein Index, die bzw. der diese Partitionsfunktion auf der datecol-Partitionierungsspalte verwendet, partitioniert wird.

Partition 1 2 ... 11 12
Werte datecol < February 1, 2003 datecol >= February 1, 2003 UND datecol < March 1, 2003 datecol >= November 1, 2003 UND col1 < December 1, 2003 datecol >= December 1, 2003

D: Erstellen einer Partitionsfunktion für eine char-Spalte

Mit der folgenden Partitionsfunktion wird eine Tabelle oder ein Index in vier Partitionen partitioniert.

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

In der folgenden Tabelle wird gezeigt, wie eine Tabelle, die diese Partitionsfunktion auf der Partitionierungsspalte col1 verwendet, partitioniert würde.

Partition 1 2 3 4
Werte col1 < EX... col1 >= EX UND col1 < RXE... col1 >= RXE UND col1 < XR... col1 >= XR

E. Erstellen von 15.000 Partitionen

Mit der folgenden Partitionsfunktion wird eine Tabelle oder ein Index in 15.000 Partitionen partitioniert.

--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. Erstellen von Partitionen für mehrere Jahre

Die folgende Partitionsfunktion partitioniert eine Tabelle oder einen Index in einer datetime2-Spalte in 50 Partitionen. Für jeden Monat zwischen Januar 2007 und Januar 2011 gibt es eine Partition.

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

Weitere Informationen

Partitionierte Tabellen und Indizes
$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)