Поделиться через


CREATE PARTITION FUNCTION (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

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

Соглашения о синтаксисе 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.

Дополнительные сведения см. в статье Недетерминированное преобразование строк дат литералов в значения DATE.

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

LEFT | RIGHT
Указывает, какая сторона каждого интервала границы, слева или справа, boundary_value [ ,... n ] относится, когда значения интервала отсортированы по ядро СУБД в порядке возрастания слева направо. Если значение не задано, то по умолчанию используется значение 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

B. Создание функции секционирования 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 datecol>= December 1, 2003

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

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

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

Следующие шаги

Дополнительные сведения о секционировании таблиц и связанных с ними понятиях см. в следующих статьях: