CREATE PARTITION FUNCTION (Transact-SQL)CREATE PARTITION FUNCTION (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ ЭТОЙ СТАТЬИ:даSQL Server (начиная с 2008)даБаза данных SQL AzureнетХранилище данных SQL AzureнетParallel Data WarehouseTHIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Создает функцию в текущей базе данных, которая сопоставляет строки таблицы или индекса с секциями, основываясь на значениях элементов заданного столбца.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. Инструкция CREATE PARTITION FUNCTION используется на начальной стадии создания секционированной таблицы или индекса.Using CREATE PARTITION FUNCTION is the first step in creating a partitioned table or index. Таблица или индекс в SQL Server 2017SQL Server 2017 могут содержать до 15 000 секций.In SQL Server 2017SQL Server 2017, a table or index can have a maximum of 15,000 partitions.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

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

АргументыArguments

partition_function_namepartition_function_name
Имя функции секционирования.Is the name of the partition function. Имена функций секционирования должны быть уникальными внутри базы данных и соответствовать правилам для идентификаторов.Partition function names must be unique within the database and comply with the rules for identifiers.

input_parameter_typeinput_parameter_type
Тип данных столбца, используемого для секционирования.Is the data type of the column used for partitioning. В качестве столбцов секционирования могут использоваться данные любого типа, кроме text, ntext, image, xml, timestamp, varchar(max), nvarchar(max), varbinary(max), псевдонимов типов данных, а также определяемых пользователем типов данных CLR.All data types are valid for use as partitioning columns, except text, ntext, image, xml, timestamp, varchar(max), nvarchar(max), varbinary(max), alias data types, or CLR user-defined data types.

Столбец секционирования задается с помощью инструкции CREATE TABLE или CREATE INDEX.The actual column, known as a partitioning column, is specified in the CREATE TABLE or CREATE INDEX statement.

boundary_valueboundary_value
Задает граничные значения для каждой секции секционированной таблицы или индекса, в которой используется аргумент partition_function_name.Specifies the boundary values for each partition of a partitioned table or index that uses partition_function_name. Если аргумент boundary_value пуст, функция секционирования сопоставляет всю таблицу или индекс с одной секцией с помощью partition_function_name.If boundary_value is empty, the partition function maps the whole table or index using partition_function_name into a single partition. Может использоваться только один столбец секционирования, заданный с помощью инструкции CREATE TABLE или CREATE INDEX.Only one partitioning column, specified in a CREATE TABLE or CREATE INDEX statement, can be used.

Аргумент boundary_value является постоянным выражением, которое может обращаться к переменным.boundary_value is a constant expression that can reference variables. К ним относятся переменные типов данных, определяемых пользователем, а также стандартные и пользовательские функции.This includes user-defined type variables, or functions and user-defined functions. Он не может ссылаться на выражения Transact-SQLTransact-SQL.It cannot reference Transact-SQLTransact-SQL expressions. Аргумент boundary_value должен либо соответствовать типу данных аргумента input_parameter_type, либо неявно в него преобразовываться; кроме того, данные параметра не могут быть усечены во время неявного преобразования типов данных, если размер и масштаб значения не соответствует типу данных аргумента input_parameter_type.boundary_value must either match or be implicitly convertible to the data type supplied in input_parameter_type, and cannot be truncated during implicit conversion in a way that the size and scale of the value does not match that of its corresponding input_parameter_type.

Примечание

Если аргумент boundary_value содержит литералы datetime или smalldatetime, то они оцениваются исходя из предположения, что языком сеанса является us_english.If boundary_value consists of datetime or smalldatetime literals, these literals are evaluated assuming that us_english is the session language. Такое поведение является устаревшим.This behavior is deprecated. Чтобы убедиться, что определение функции секционирования работает правильно для всех языков сеанса, рекомендуется использование констант, интерпретируемых одинаково для всех языковых настроек, таких как формат «ггггммдд», либо выполнить явное преобразование литералов в определенный стиль.To make sure the partition function definition behaves as expected for all session languages, we recommend that you use constants that are interpreted the same way for all language settings, such as the yyyymmdd format; or explicitly convert literals to a specific style. Чтобы определить язык сеанса сервера, выполните SELECT @@LANGUAGE.To determine the language session of your server, run SELECT @@LANGUAGE.

...n...n
Указывает число значений, предоставленных boundary_value, оно не должно превышать 14 999.Specifies the number of values supplied by boundary_value, not to exceed 14,999. Число создаваемых секций равно n + 1.The number of partitions created is equal to n + 1. Перечисление значений по порядку не является обязательным.The values do not have to be listed in order. Если значения выведены не по порядку, компонент Компонент Database EngineDatabase Engine сортирует их, создает функцию и выдает предупреждение о том, что значения выданы не по порядку.If the values are not in order, the Компонент Database EngineDatabase Engine sorts them, creates the function, and returns a warning that the values are not provided in order. В случае наличия в параметре n повторяющихся значений ядро СУБД выдает ошибку.The Database Engine returns an error if n includes any duplicate values.

LEFT | RIGHTLEFT | RIGHT
Указывает, к какой области интервала значений принадлежит аргумент boundary_value [ ,...n ] (к левой или правой) для случая, когда значения интервалов были отсортированы компонентом Компонент Database EngineDatabase Engine по возрастанию слева направо.Specifies to which side of each boundary value interval, left or right, the boundary_value [ ,...n ] belongs, when interval values are sorted by the Компонент Database EngineDatabase Engine in ascending order from left to right. Если значение не задано, то по умолчанию используется значение LEFT.If not specified, LEFT is the default.

RemarksRemarks

Область действия функции секционирования ограничена базой данных, в которой она была создана.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.

Все строки, которым соответствуют значения NULL столбца секционирования, располагаются в самой левой секции, кроме случая, когда задано пустое граничное значение и параметр RIGHT.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. В данном случае самая левая секция является пустой, и в нее помещаются значения NULL.In this case, the left-most partition is an empty partition, and NULL values are placed in the following partition.

РазрешенияPermissions

Для выполнения инструкции CREATE PARTITION FUNCTION необходимо наличие одного из следующих разрешений.Any one of the following permissions can be used to execute CREATE PARTITION FUNCTION:

  • Разрешение ALTER ANY DATASPACE.ALTER ANY DATASPACE permission. Это разрешение назначено по умолчанию членам предопределенной роли сервера sysadmin и предопределенных ролей базы данных db_owner и db_ddladmin.This permission defaults to members of the sysadmin fixed server role and the db_owner and db_ddladmin fixed database roles.

  • Разрешение CONTROL или ALTER для базы данных, в которой создается функция секционирования.CONTROL or ALTER permission on the database in which the partition function is being created.

  • Разрешение CONTROL SERVER или ALTER ANY DATABASE для сервера базы данных, в которой создается функция секционирования.CONTROL SERVER or ALTER ANY DATABASE permission on the server of the database in which the partition function is being created.

ПримерыExamples

A.A. Создание функции секционирования RANGE LEFT для столбца данных типа intCreating 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);  

В следующей таблице показано, как будет разбита таблица, использующая эту функцию секционирования для столбца секционирования col1.The following table shows how a table that uses this partition function on partitioning column col1 would be partitioned.

СекцияPartition 11 22 33 44
ЗначенияValues col1 <= 1col1 <= 1 col1 > 1 AND col1 <= 100col1 > 1 AND col1 <= 100 col1 > 100 AND col1 <=1000col1 > 100 AND col1 <=1000 col1 > 1000col1 > 1000

Б.B. Создание функции секционирования RANGE RIGHT для столбца данных типа intCreating a RANGE RIGHT partition function on an int column

В следующей функции секционирования используются те же значения параметров boundary_value [ ,...n ], что и в предыдущем примере. Единственное различие — в данном случае задается RANGE RIGHT.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);  

В следующей таблице показано, как будет разбита таблица, использующая эту функцию секционирования для столбца секционирования col1.The following table shows how a table that uses this partition function on partitioning column col1 would be partitioned.

СекцияPartition 11 22 33 44
ЗначенияValues col1 < 1col1 < 1 col1 >= 1 AND col1 < 100col1 >= 1 AND col1 < 100 col1 >= 100 AND col1 < 1000col1 >= 100 AND col1 < 1000 col1 >= 1000col1 >= 1000

В.C. Создание функции секционирования RANGE RIGHT для столбца данных типа datetimeCreating a RANGE RIGHT partition function on a datetime column

Следующая функция секционирования разбивает таблицу или индекс на 12 секций, по одной на каждый месяц года со значениями в столбце типа datetime.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');  

В следующей таблице показано, как будет разбита таблица или индекс, использующие эту функцию секционирования для столбца секционирования datecol.The following table shows how a table or index that uses this partition function on partitioning column datecol would be partitioned.

СекцияPartition 11 22 ...... 1111 1212
ЗначенияValues datecol < February 1, 2003datecol < February 1, 2003 datecol >= February 1, 2003 AND datecol < March 1, 2003datecol >= February 1, 2003 AND datecol < March 1, 2003 datecol >= November 1, 2003 AND col1 < December 1, 2003datecol >= November 1, 2003 AND col1 < December 1, 2003 datecol >= December 1, 2003datecol >= December 1, 2003

Г.D. Создание функции секционирования для столбца данных типа charCreating 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');  

В следующей таблице показано, как будет разбита таблица, использующая эту функцию секционирования для столбца секционирования col1.The following table shows how a table that uses this partition function on partitioning column col1 would be partitioned.

СекцияPartition 11 22 33 44
ЗначенияValues col1 < EX...col1 < EX... col1 >= EX AND col1 < RXE...col1 >= EX AND col1 < RXE... col1 >= RXE AND col1 < XR...col1 >= RXE AND col1 < XR... col1 >= XRcol1 >= XR

Д.E. Создание 15 000 секцийCreating 15,000 partitions

Следующая функция секционирования разбивает таблицу или индекс на 15 000 секций.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

Следующая функция секционирования разбивает таблицу или индекс на 50 секций в столбце datetime2.The following partition function partitions a table or index into 50 partitions on a datetime2 column. Существует по одному разделу для каждого месяца с января 2007 года по январь 2011 года.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  

См. также:See Also

Секционированные таблицы и индексы Partitioned Tables and Indexes
$PARTITION (Transact-SQL) $PARTITION (Transact-SQL)
ALTER PARTITION FUNCTION (Transact-SQL) ALTER PARTITION FUNCTION (Transact-SQL)
DROP PARTITION FUNCTION (Transact-SQL) DROP PARTITION FUNCTION (Transact-SQL)
CREATE PARTITION SCHEME (Transact-SQL) CREATE PARTITION SCHEME (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
CREATE INDEX (Transact-SQL) CREATE INDEX (Transact-SQL)
ALTER INDEX (Transact-SQL) ALTER INDEX (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
sys.partition_functions (Transact-SQL) sys.partition_functions (Transact-SQL)
sys.partition_parameters (Transact-SQL) sys.partition_parameters (Transact-SQL)
sys.partition_range_values (Transact-SQL) sys.partition_range_values (Transact-SQL)
sys.partitions (Transact-SQL) sys.partitions (Transact-SQL)
sys.tables (Transact-SQL) sys.tables (Transact-SQL)
sys.indexes (Transact-SQL) sys.indexes (Transact-SQL)
sys.index_columns (Transact-SQL)sys.index_columns (Transact-SQL)