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

適用対象: ○SQL Server (2008 以降) ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure 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 では、1 つのテーブルまたはインデックスは、最大 15,000 個のパーティションに分割できます。In SQL Server 2017SQL Server 2017, a table or index can have a maximum of 15,000 partitions.

トピック リンク アイコン Transact-SQL 構文表記規則Topic 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. すべてのデータ型は、 textntextimagexmltimestampvarchar(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 を使用するテーブルまたはインデックス全体が 1 つのパーティションにマップされます。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 ステートメントで指定された 1 つのパーティション分割列のみが使用できます。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. すべてのセッション言語でパーティション関数の定義が正しく認識されるようにするには、yyyymmdd 形式のようにすべての言語設定で同様に解釈される定数を使用するか、リテラルを特定の型に明示的に変換することをお勧めします。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.

詳細については、「リテラル日付文字列を DATE 値に非決定論的に変換する」を参照してください。For more information, see Nondeterministic conversion of literal date strings into DATE values.

...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 Engine は値を並び替えて、関数を作成し、値が順に並んでいないという警告を返します。If the values are not in order, the データベース エンジンDatabase 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
データベース エンジンDatabase Engineが境界値を左から右の昇順にソートする場合に、boundary_value [ ,...n ] が各境界値間隔のどちら側 (左または右) に属するかを指定します。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 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 値がある行はすべて、左端のパーティションに配置されます。ただし、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. int 型の列に RANGE LEFT パーティション関数を作成するCreating a RANGE LEFT partition function on an int column

次のパーティション関数は、テーブルまたはインデックスを 4 つのパーティションに分割します。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.B. int 型の列に RANGE RIGHT パーティション関数を作成するCreating 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.C. datetime 型の列に RANGE RIGHT パーティション関数を作成するCreating a RANGE RIGHT partition function on a datetime column

次のパーティション関数では、テーブルまたはインデックスを、datetime 列の値が表す月ごとに 12 のパーティションに分割します。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.D. char 型の列にパーティション関数を作成するCreating a partition function on a char column

次のパーティション関数は、テーブルまたはインデックスを 4 つのパーティションに分割します。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.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.F. 複数年のパーティションを作成するCreating partitions for multiple years

次のパーティション関数は、テーブルまたはインデックスを datetime2 列の 50 のパーティションに分割します。The following partition function partitions a table or index into 50 partitions on a datetime2 column. 2007 年 1 月から 2011 年 1 月までの各月に対して 1 つのパーティションがあります。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)