Freigeben über


CREATE PARTITION FUNCTION (Transact-SQL)

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 2012 kann maximal 15.000 Partitionen aufweisen.

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen

Syntax

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

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. Alle Datentypen sind für die Verwendung als Partitionierungsspalten gültig, außer text, ntext, image, xml, timestamp, varchar(max), nvarchar(max), varbinary(max), Aliasdatentypen oder benutzerdefinierte CLR-Datentypen.

    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/der partition_function_name verwendet. Wenn boundary_value leer ist, ordnet die Partitionsfunktion die gesamte Tabelle oder den gesamten Index mithilfe von partition_function_name einer einzigen 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 dem in input_parameter_type bereitgestellten Datentyp entsprechen oder implizit in diesen Datentyp konvertiert werden und kann während der impliziten Konvertierung nicht so abgeschnitten werden, dass Größe und Dezimalstellen des Werts nicht mit der Größe und den Dezimalstellen des ihm entsprechenden input_parameter_type übereinstimmen.

    HinweisHinweis

    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.

  • ...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 Database Engine (Datenbankmodul) sortiert, die Funktion wird erstellt und eine Warnung zurückgegeben, die besagt, dass die Werte nicht der Reihenfolge nach bereitgestellt werden. Das Datenbankmodul 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 Database Engine (Datenbankmodul) in aufsteigender Reihenfolge von links nach rechts sortiert werden. Fehlt die Angabe, ist LEFT der Standardwert.

Hinweise

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 AND col1 < 100

col1 >= 100 AND 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 AND datecol < March 1, 2003

datecol >= November 1, 2003 AND 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 AND col1 < RXE...

col1 >= RXE AND 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

Siehe auch

Verweis

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

Konzepte

Partitionierte Tabellen und Indizes