ALTER PARTITION FUNCTION (Transact-SQL)

境界値の分割または結合によって、パーティション関数を変更します。ALTER PARTITION FUNCTION を実行すると、任意のテーブルまたはインデックスで、そのパーティション関数を使用する 1 つのパーティションを 2 つに分割したり、2 つのパーティションを 1 つにマージしたりできます。

注記注意

複数のテーブルやインデックスで同じパーティション関数を使用できます。ALTER PARTITION FUNCTION は、1 回のトランザクションでこれらすべてを操作できます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

ALTER PARTITION FUNCTION partition_function_name()
{ 
    SPLIT RANGE ( boundary_value )
  | MERGE RANGE ( boundary_value ) 
} [ ; ]

引数

  • partition_function_name
    変更するパーティション関数の名前です。

  • SPLIT RANGE ( boundary_value )
    1 つのパーティションをパーティション関数に追加します。boundary_value は、新しいパーティションの範囲を決定します。boundary_value は、そのパーティション関数の既存の境界範囲と異なるようにする必要があります。boundary_value に基づき、データベース エンジン によって既存の範囲が 2 つに分割されます。この 2 つのうち、新しい boundary_value の含まれる方が、新しいパーティションと見なされます。

    新しいパーティションを保持するには、ファイル グループがオンラインに存在し、このパーティション関数を使用するパーティション構成によって NEXT USED とマークされている必要があります。ファイル グループは、CREATE PARTITION SCHEME ステートメントでパーティションに割り当てられます。CREATE PARTITION SCHEME ステートメントで必要以上のファイル グループを割り当てた (CREATE PARTITION FUNCTION ステートメントで、パーティションを含めるファイル グループよりも少ないパーティションを作成した) 場合、割り当てられていないファイル グループができ、そのうちの 1 つがパーティション構成によって NEXT USED とマークされます。このファイル グループに、新しいパーティションが保持されます。パーティション構成によって NEXT USED とマークされたファイル グループがない場合、新しいパーティションを保持するには、ALTER PARTITION SCHEME を使用して、ファイル グループを追加するか、既存のファイル グループを指定する必要があります。既にパーティションを保持するファイル グループは、追加のパーティションを保持するように指定できます。1 つのパーティション関数を複数のパーティション構成に関連付けできるので、パーティションを追加するパーティション関数を使用するには、すべてのパーティション構成に NEXT USED ファイル グループが必要です。NEXT USED ファイル グループがない場合、パーティション構成に NEXT USED ファイル グループが存在しないというエラーが表示され、ALTER PARTITION FUNCTION が失敗します。

    すべてのパーティションを同じファイル グループ内に作成した場合は、最初に、そのグループが自動的に NEXT USED ファイル グループに割り当てられます。ただし、分割操作を実行すると、指定された NEXT USED ファイル グループがなくなります。このファイル グループは、ALTER PARITION SCHEME を使用して NEXT USED ファイル グループになるように明示的に割り当てる必要があります。そうしないと、その後の分割操作が失敗します。

  • MERGE [ RANGE ( boundary_value) ]
    パーティションを削除し、そのパーティションに存在する任意の値を残りのパーティションのうちの 1 つにマージします。RANGE (boundary_value) は、既存の境界値である必要があります。ここに、削除したパーティションの値がマージされます。boundary_value が最初に保持されていたファイル グループは、残りのパーティションによって使用されている場合、または NEXT USED プロパティでマークされている場合を除き、パーティション構成から削除されます。マージされたパーティションは、boundary_value が最初に保持されていなかったファイル グループにあります。boundary_value は定数式であり、変数 (ユーザー定義型変数を含む) または関数 (ユーザー定義関数を含む) を参照できます。Transact-SQL 式を参照することはできません。boundary_value は、対応するパーティション分割列のデータ型と同じであるか、そのデータ型に暗黙的に変換できる必要があります。また、暗黙的に変換している間は、対応する input_parameter_type と値のサイズおよび小数点以下桁数が異なる方法で切り捨てることはできません。

ベスト プラクティス

パーティションの分割 (新しいデータを読み込む前) とマージ (古いデータをアンロードした後) によってデータが移動されないようにするには、パーティション範囲の両端に、常に空のパーティションを用意しておいてください。データが設定されているパーティションを分割またはマージしないようにしてください。これは非常に効率の悪い処理になる可能性があります。この処理では通常の 4 倍の量のログが生成され、重大なロックも発生する場合があるためです。

制限事項と制約事項

ALTER PARTITION FUNCTION は、1 回のアトミックな操作で、その関数を使用するすべてのテーブルおよびインデックスのパーティションを分割し直します。しかし、この操作はオフラインで実行され、分割し直すエクステントによってはリソースを大きく消費します。

ALTER PARTITION FUNCTION を使用すると、1 つのパーティションを 2 つに分割する、または 2 つのパーティションを 1 つにマージすることができます。他のパーティション分割方法でテーブルを変更する (たとえば、10 のパーティションを 5 つにする) には、次のいずれかを実行します。システムの構成に応じて、これらの方法のリソース消費量は異なります。

  • 適切なパーティション関数でパーティション テーブルを新規作成し、次に INSERT INTO...SELECT FROM ステートメントを使用して、古いテーブルのデータを新しいテーブルに挿入します。

  • パーティション分割されたクラスター化インデックスを、ヒープ上に作成します。

    注意

    パーティション分割されたクラスター化インデックスを削除すると、パーティション分割されたヒープが生成されます。

  • Transact-SQL の CREATE INDEX ステートメントと DROP EXISTING = ON 句を使用して、既存のパーティション インデックスを削除および再構築します。

  • 一連の ALTER PARTITION FUNCTION ステートメントを実行します。

ALTER PARITITION FUNCTION の影響を受けるすべてのファイル グループは、オンラインである必要があります。

そのパーティション関数を使用するテーブル上に、無効化されたクラスター化インデックスがあると、ALTER PARTITION FUNCTION は失敗します。

SQL Server では、パーティション関数の変更に関するレプリケーションはサポートされていません。パブリケーション データベース内のパーティション関数への変更は、手動でサブスクリプション データベースに適用させる必要があります。

権限

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

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

  • パーティション関数が作成されたデータベースでの CONTROL または ALTER 権限。

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

A. パーティション テーブルまたはパーティション インデックスの 1 つのパーティションを 2 つのパーティションに分割する

次の例では、テーブルまたはインデックスを 4 つのパーティションに分割するパーティション関数を作成します。ALTER PARTITION FUNCTION でこれらのパーティションのうちの 1 つを 2 つに分割して、合計 5 つのパーティションを作成します。

IF EXISTS (SELECT * FROM sys.partition_functions
    WHERE name = 'myRangePF1')
DROP PARTITION FUNCTION myRangePF1;
GO
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );
GO
--Split the partition between boundary_values 100 and 1000
--to create two partitions between boundary_values 100 and 500
--and between boundary_values 500 and 1000.
ALTER PARTITION FUNCTION myRangePF1 ()
SPLIT RANGE (500);

B. パーティション テーブルの 2 つのパーティションを 1 つのパーティションにマージする

次の例では、上記と同じパーティション関数を作成し、次にこれらのパーティションのうちの 2 つを 1 つにマージして、合計 3 つのパーティションにします。

IF EXISTS (SELECT * FROM sys.partition_functions
    WHERE name = 'myRangePF1')
DROP PARTITION FUNCTION myRangePF1;
GO
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );
GO
--Merge the partitions between boundary_values 1 and 100
--and between boundary_values 100 and 1000 to create one partition
--between boundary_values 1 and 1000.
ALTER PARTITION FUNCTION myRangePF1 ()
MERGE RANGE (100);