CREATE PARTITION FUNCTION (Transact-SQL)

Создает функцию в текущей базе данных, которая сопоставляет строки таблицы или индекса с секциями, основываясь на значениях элементов заданного столбца. Инструкция CREATE PARTITION FUNCTION используется на начальной стадии создания секционированной таблицы или индекса. Таблица или индекс в SQL Server 2014 могут содержать до 15 000 секций.

Применимо для следующих объектов: SQL Server (начиная с SQL Server 2008 до текущей версии).

Значок ссылки на раздел Cинтаксические обозначения в Transact-SQL

Синтаксис

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

Аргументы

  • partition_function_name
    Имя функции секционирования. Имена функций секционирования должны быть уникальными внутри базы данных и соответствовать правилам для идентификаторов.

  • input_parameter_type
    Тип данных столбца, используемого для секционирования. В качестве столбцов секционирования могут использоваться данные любого типа, кроме text, ntext, image, xml, timestamp, varchar(max), nvarchar(max), varbinary(max), типов данных-псевдонимов, а также определяемых пользователем типов данных CLR.

    Столбец секционирования задается с помощью инструкции CREATE TABLE или CREATE INDEX.

  • boundary_value
    Задает граничные значения для каждой секции секционированной таблицы или индекса, в которой используется аргумент partition_function_name. Если параметр boundary_value не задан, функция секционирования сопоставляет всю таблицу или индекс одной секции, используя аргумент partition_function_name. Может использоваться только один столбец секционирования, заданный с помощью инструкции CREATE TABLE или CREATE INDEX.

    Аргумент boundary_value является постоянным выражением, которое может обращаться к переменным. К ним относятся переменные типов данных, определяемых пользователем, а также стандартные и пользовательские функции. Он не может ссылаться на выражения Transact-SQL. Параметр boundary_value должен соответствовать типу данных, который поддерживается в input_parameter_type, либо допускать неявное преобразование в него; кроме того, данный параметр не может усекаться во время неявного преобразования, если размер и масштаб значения не совпадают с соответствующим типом input_parameter_type.

    Примечание

    Если аргумент boundary_value содержит литералы datetime или smalldatetime, то они оцениваются, предполагая, что языком сеанса является us_english.Такое поведение является устаревшим.Чтобы убедиться, что определение функции секционирования работает правильно для всех языков сеанса, рекомендуется использование констант, интерпретируемых одинаково для всех языковых настроек, таких как формат «ггггммдд», либо выполнить явное преобразование литералов в определенный стиль.Чтобы определить язык сеанса сервера, выполните SELECT @@LANGUAGE.

  • ...n
    Указывает число значений, предоставленных boundary_value, оно не должно превышать 14,999. Число создаваемых секций равно n + 1. Перечисление значений по порядку не является обязательным. Если значения выведены не по порядку, компонент Компонент Database Engine сортирует их, создает функцию и выдает предупреждение о том, что значения выданы не по порядку. В случае наличия в параметре n повторяющихся значений компонент Database Engine выдает ошибку.

  • LEFT | RIGHT
    Указывает, к какой области интервала значений принадлежит аргумент boundary_value [ ,...n ] (к левой или правой) для случая, когда значения интервалов были отсортированы компонентом Компонент Database Engine по возрастанию слева направо. Если значение не задано, то по умолчанию используется значение LEFT.

Замечания

Область действия функции секционирования ограничена базой данных, в которой она была создана. Функции секционирования располагаются в отдельном от других функций пространстве имен внутри базы данных.

Все строки, которым соответствуют значения NULL столбца секционирования, располагаются в самой левой секции, кроме случая, когда задано пустое граничное значение и параметр RIGHT. В данном случае самая левая секция является пустой, и в нее помещаются значения NULL.

Разрешения

Для выполнения инструкции CREATE PARTITION FUNCTION необходимо наличие одного из следующих разрешений.

  • Разрешение ALTER ANY DATASPACE. Данное разрешение по умолчанию назначено членам предопределенной роли сервера sysadmin и предопределенных ролей базы данных db_owner и db_ddladmin.

  • Разрешение CONTROL или ALTER для базы данных, в которой создается функция секционирования.

  • Разрешение CONTROL SERVER или ALTER ANY DATABASE для сервера базы данных, в которой создается функция секционирования.

Примеры

А.Создание функции секционирования RANGE LEFT для столбца данных типа int

Следующая функция секционирования разбивает таблицу или индекс на четыре секции.

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

В следующей таблице показано, как будет разбита таблица, использующая эту функцию секционирования для столбца секционирования col1.

Секция

1

2

3

4

Значения

col1 <= 1

col1 > 1 AND col1 <= 100

col1 > 100 AND col1 <=1000

col1 > 1000

Б.Создание функции секционирования RANGE RIGHT для столбца данных типа int

В следующей функции секционирования используются те же значения параметров boundary_value [ ,...n ], что и в предыдущем примере. Единственное различие — в данном случае задается RANGE RIGHT.

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

В следующей таблице показано, как будет разбита таблица, использующая эту функцию секционирования для столбца секционирования col1.

Секция

1

2

3

4

Значения

col1 < 1

col1 >= 1 AND col1 < 100

col1 >= 100 AND col1 < 1000

col1 >= 1000

В.Создание функции секционирования RANGE RIGHT для столбца данных типа datetime

Следующая функция секционирования разбивает таблицу или индекс на 12 секций, по одной на каждый месяц года со значениями в столбце типа datetime.

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

В следующей таблице показано, как будет разбита таблица или индекс, использующие эту функцию секционирования для столбца секционирования datecol.

Секция

1

2

...

11

12

Значения

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

Г.Создание функции секционирования для столбца данных типа char

Следующая функция секционирования разбивает таблицу или индекс на четыре секции.

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

В следующей таблице показано, как будет разбита таблица, использующая эту функцию секционирования для столбца секционирования col1.

Секция

1

2

3

4

Значения

col1 < EX...

col1 >= EX AND col1 < RXE...

col1 >= RXE AND col1 < XR...

col1 >= XR

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

Следующая функция секционирования разбивает таблицу или индекс на 15 000 секций.

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

Е.Создание разделов на несколько лет

Следующая функция секционирования разбивает таблицу или индекс на 50 секций в столбце datetime2. Существует по одному разделу для каждого месяца с января 2007 года по январь 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

См. также

Справочник

$PARTITION (Transact-SQL)

ALTER PARTITION FUNCTION (Transact-SQL)

DROP PARTITION FUNCTION (Transact-SQL)

CREATE PARTITION SCHEME (Transact-SQL)

CREATE TABLE (SQL Server)

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)

Основные понятия

Секционированные таблицы и индексы