CREATE PARTITION FUNCTION (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

テーブルまたはインデックスの行を指定された列の値に基づいてパーティションにマップする関数を、現在のデータベース内に作成します。 CREATE PARTITION FUNCTION の使用は、パーティション テーブルまたはパーティション インデックスを作成する最初の手順です。 1 つのテーブルまたはインデックスは、最大 15,000 個のパーティションに分割できます。

Transact-SQL 構文表記規則

構文

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

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

partition_function_name
パーティション関数の名前です。 パーティション関数の名前は、データベース内で一意であり、かつ識別子のルールに従っている必要があります。

input_parameter_type
パーティション分割に使用される列のデータ型です。 すべてのデータ型は、 textntextimagexmltimestampvarchar(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 を実行してください。

詳細については、「リテラル日付文字列を DATE 値に非決定論的に変換する」を参照してください。

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

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

注釈

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

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

アクセス許可

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

  • ALTER ANY DATASPACE 権限。 この権限は、既定では sysadmin 固定サーバー ロール、 db_owner 固定データベース ロール、および db_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  

次のステップ

テーブルのパーティション分割と関連する概念の詳細については、次の記事を参照してください。