CREATE PARTITION FUNCTION (Transact-SQL)
Creates a function in the current database that maps the rows of a table or index into partitions based on the values of a specified column. Using CREATE PARTITION FUNCTION is the first step in creating a partitioned table or index. In SQL Server 2012, a table or index can have a maximum of 15,000 partitions.
The scope of a partition function is limited to the database that it is created in. Within the database, partition functions reside in a separate namespace from the other functions.
Any rows whose partitioning column has null values are placed in the left-most partition, unless NULL is specified as a boundary value and RIGHT is indicated. In this case, the left-most partition is an empty partition, and NULL values are placed in the following partition.
Any one of the following permissions can be used to execute CREATE PARTITION FUNCTION:
-
ALTER ANY DATASPACE permission. This permission defaults to members of the sysadmin fixed server role and the db_owner and db_ddladmin fixed database roles.
-
CONTROL or ALTER permission on the database in which the partition function is being created.
-
CONTROL SERVER or ALTER ANY DATABASE permission on the server of the database in which the partition function is being created.
A. Creating a RANGE LEFT partition function on an int column
The following partition function will partition a table or index into four partitions.
CREATE PARTITION FUNCTION myRangePF1 (int) AS RANGE LEFT FOR VALUES (1, 100, 1000);
The following table shows how a table that uses this partition function on partitioning column col1 would be partitioned.
|
Partition |
1 |
2 |
3 |
4 |
|---|---|---|---|---|
|
Values |
col1 <= 1 |
col1 > 1 AND col1 <= 100 |
col1 > 100 AND col1 <=1000 |
col1 > 1000 |
B. Creating a RANGE RIGHT partition function on an int column
The following partition function uses the same values for boundary_value [ ,...n ] as the previous example, except it specifies RANGE RIGHT.
CREATE PARTITION FUNCTION myRangePF2 (int) AS RANGE RIGHT FOR VALUES (1, 100, 1000);
The following table shows how a table that uses this partition function on partitioning column col1 would be partitioned.
|
Partition |
1 |
2 |
3 |
4 |
|---|---|---|---|---|
|
Values |
col1 < 1 |
col1 >= 1 AND col1 < 100 |
col1 >= 100 AND col1 < 1000 |
col1 >= 1000 |
C. Creating a RANGE RIGHT partition function on a datetime column
The following partition function partitions a table or index into 12 partitions, one for each month of a year's worth of values in a datetime column.
CREATE PARTITION FUNCTION [myDateRangePF1] (datetime)
AS RANGE RIGHT FOR VALUES ('20030201', '20030301', '20030401',
'20030501', '20030601', '20030701', '20030801',
'20030901', '20031001', '20031101', '20031201');
The following table shows how a table or index that uses this partition function on partitioning column datecol would be partitioned.
|
Partition |
1 |
2 |
... |
11 |
12 |
|---|---|---|---|---|---|
|
Values |
datecol < February 1, 2003 |
datecol >= February 1, 2003 AND datecol < March 1, 2003 |
|
datecol >= November 1, 2003 AND col1 < December 1, 2003 |
col1 >= December 1, 2003 |
D. Creating a partition function on a char column
The following partition function partitions a table or index into four partitions.
CREATE PARTITION FUNCTION myRangePF3 (char(20))
AS RANGE RIGHT FOR VALUES ('EX', 'RXE', 'XR');
The following table shows how a table that uses this partition function on partitioning column col1 would be partitioned.
|
Partition |
1 |
2 |
3 |
4 |
|---|---|---|---|---|
|
Values |
col1 < EX... |
col1 >= EX AND col1 < RXE... |
col1 >= RXE AND col1 < XR... |
col1 >= XR |
E. Creating 15,000 partitions
The following partition function partitions a table or index into 15,000 partitions.
--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. Creating partitions for multiple years
The following partition function partitions a table or index into 50 partitions on a datetime2 column. There is one partitions for each month between January 2007 and January 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
