CREATE PARTITION FUNCTION (Transact-SQL)

テーブルまたはインデックスの行を指定された列の値に基づいてパーティションにマップする関数を、現在のデータベース内に作成します。 CREATE PARTITION FUNCTION の使用は、パーティション テーブルまたはパーティション インデックスを作成する最初の手順です。 SQL Server 2012 では、1 つのテーブルまたはインデックスは、最大 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 を使用するテーブルまたはインデックス全体が 1 つのパーティションにマップされます。 CREATE TABLE ステートメントまたは CREATE INDEX ステートメントで指定された 1 つのパーティション分割列のみが使用できます。

    boundary_value は、変数を参照できる定数式です。 これには、ユーザー定義型の変数、または関数およびユーザー定義関数が含まれます。 この定数式で Transact-SQL 式を参照することはできません。 boundary_value は、input_parameter_type に指定された対応するデータ型と同じであるか、そのデータ型に暗黙的に変換できる必要があります。また、暗黙的に変換している間は、対応する input_parameter_type と値のサイズおよび小数点以下桁数が異なる方法で切り捨てることはできません。

    注意

    boundary_value に、datetime または smalldatetime 型のリテラルが含まれる場合、それらのリテラルは、セッション言語が us_english であることを前提に評価されます。 ただし、この動作は廃止予定となっています。 すべてのセッション言語でパーティション関数の定義が正しく認識されるようにするには、yyyymmdd 形式のようにすべての言語設定で同様に解釈される定数を使用するか、リテラルを特定の型に明示的に変換することをお勧めします。 サーバーのセッション言語を確認するには、SELECT @@LANGUAGE を実行してください。

  • ...n
    boundary_value で与えられる値の数を指定します。14,999 以下の数を指定する必要があります。 作成されるパーティションの数は n + 1 になります。 値を順序どおり指定する必要はありません。 値が順不同の場合、データベース エンジン は値を並び替えて、関数を作成し、値が順に並んでいないという警告を返します。 n に重複値が含まれている場合、データベース エンジンはエラーを返します。

  • LEFT | RIGHT
    データベース エンジンが境界値を左から右の昇順にソートする場合に、boundary_value [ ,...n ] が各境界値間隔のどちら側 (左または右) に属するかを指定します。 指定しない場合は、LEFT が既定値です。

説明

パーティション関数のスコープは、関数が作成されたデータベース内に制限されます。 データベース内では、パーティション関数は他の関数とは別の名前空間に配置されます。

パーティション分割列に NULL 値がある行はすべて、左端のパーティションに配置されます。ただし、NULL が境界値として指定され、RIGHT が指定された場合は除きます。 この場合、左端のパーティションは空のパーティションになり、NULL 値は次のパーティションに配置されます。

権限

次のいずれかの権限を使用すると、CREATE PARTITION FUNCTION を実行できます。

  • ALTER ANY DATASPACE 権限。 この権限は、既定では、sysadmin 固定サーバー ロールおよび db_ownerdb_ddladmin 固定データベース ロールのメンバーに与えられています。

  • データベースの CONTROL 権限または ALTER 権限 (パーティション関数はこのデータベース内で作成)。

  • データベースのサーバーの CONTROL SERVER 権限または ALTER ANY DATABASE 権限 (パーティション関数はこのデータベースで作成)。

使用例

A. int 型の列に RANGE LEFT パーティション関数を作成する

次のパーティション関数は、テーブルまたはインデックスを 4 つのパーティションに分割します。

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

次の表は、パーティション分割列 col1 でこのパーティション関数を使用するテーブルがどのようにパーティション分割されるかを示します。

Partition

1

2

3

4

col1 <= 1

col1 > 1 AND col1 <= 100

col1 > 100 AND col1 <=1000

col1 > 1000

B. int 型の列に RANGE RIGHT パーティション関数を作成する

次のパーティション関数は、boundary_value [ ,...n ] に、RANGE RIGHT を除いて前の例と同じ値を指定します。

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

次の表は、パーティション分割列 col1 でこのパーティション関数を使用するテーブルがどのようにパーティション分割されるかを示します。

Partition

1

2

3

4

col1 < 1

col1 >= 1 AND col1 < 100

col1 >= 100 AND col1 < 1000

col1 >= 1000

C. datetime 型の列に RANGE RIGHT パーティション関数を作成する

次のパーティション関数では、テーブルまたはインデックスを、datetime 列の値が表す月ごとに 12 のパーティションに分割します。

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

次の表は、パーティション分割列 datecol で、このパーティション関数を使用するテーブルまたはインデックスがどのようにパーティション分割されるかを示します。

Partition

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 型の列にパーティション関数を作成する

次のパーティション関数は、テーブルまたはインデックスを 4 つのパーティションに分割します。

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

次の表は、パーティション分割列 col1 でこのパーティション関数を使用するテーブルがどのようにパーティション分割されるかを示します。

Partition

1

2

3

4

col1 < EX...

col1 >= EX AND col1 < RXE...

col1 >= RXE AND col1 < XR...

col1 >= XR

E. 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. 複数年のパーティションを作成する

次のパーティション関数は、テーブルまたはインデックスを datetime2 列の 50 のパーティションに分割します。 2007 年 1 月から 2011 年 1 月までの各月に対して 1 つのパーティションがあります。

--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 (Transact-SQL)

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)

概念

パーティション テーブルとパーティション インデックス