適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric の SQL データベース
境界値の分割または結合によって、パーティション関数を変更します。 ALTER PARTITION FUNCTION文を実行することで、パーティション関数を使うテーブルやインデックスパーティションを2つのパーティションに分割できます。 また、そのステートメントは 2 つのパーティションを 1 つのパーティションにマージすることもできます。
注意事項
複数のテーブルやインデックスで同じパーティション関数を使用できます。 ALTER PARTITION FUNCTION 単一の取引でそれらすべてに影響を与える。
構文
ALTER PARTITION FUNCTION partition_function_name()
{
SPLIT RANGE ( boundary_value )
| MERGE RANGE ( boundary_value )
} [ ; ]
引数
partition_function_name
変更するパーティション関数の名前です。
スプリットレンジ( boundary_value )
1 つのパーティションをパーティション関数に追加します。
boundary_value は、新しいパーティションの範囲を決定します。boundary_value は、そのパーティション関数の既存の境界範囲と異なるようにする必要があります。
boundary_value に基づき、データベース エンジンによって、既存の範囲が 2 つに分割されます。 これらの 2 つの範囲のうち、新しい boundary_value を持つパーティションが新しいパーティションです。
ファイル グループはオンラインに存在する必要があります。 また、新しいパーティションを保持するために、そのパーティション関数を NEXT USED として使用するパーティション構成が、そのファイルグループをマークする必要があります。 CREATE PARTITION SCHEME文はファイルグループをパーティションに割り当てます。 CREATE PARTITION FUNCTION文は、それらを保持するファイルグループよりも少ないパーティションを作成します。 CREATE PARTITION SCHEME文は必要以上に多くのファイルグループを脇に置くことがあります。 それが発生した場合、最終的に未割り当てのファイルグループが作成されることがあります。 また、パーティション構成はそのファイルグループのいずれか 1 つを NEXT USED としてマークします。 このファイル グループが新しいパーティションを保持します。 パーティションスキームがNEXT USEDとしてマークするファイルグループがない場合は、 ALTER PARTITION SCHEME 文を使わなければなりません。
ALTER PARTITION SCHEME文はファイルグループを追加するか、既存のファイルグループを選択して新しいパーティションを保持することができます。 既にパーティションを保持しているファイルグループを割り当てて、追加のパーティションを保持するように指定できます。 1 つのパーティション関数は複数のパーティション構成に参加させることができます。 この理由から、パーティションを追加する、そのパーティション関数を使用するすべてのパーティション構成に、NEXT USED ファイルグループが必要です。 そうでなければ、 ALTER PARTITION FUNCTION 文はエラーで失敗し、パーティションスキームが表示されるNEXT USEDファイルグループを欠いています。
すべてのパーティションを同じファイル グループ内に作成した場合、最初に、そのグループが自動的に NEXT USED ファイル グループに割り当てられます。 ただし、分割操作が実行された後は、選択された NEXT USED ファイルグループはなくなります。 ファイルグループを「次に使用済みファイルグループ」として明示的に割り当てると、 ALTER PARTITION SCHEME を使わないと、今後の分割操作が失敗します。
注意
列ストア インデックスに関する制限: テーブルに列ストア インデックスが存在する場合は、空のパーティションのみを分割できます。 この操作を実行する前に、列ストア インデックスを削除するか無効にする必要があります。
MERGE [ 音域 ( boundary_value) ]
パーティションを削除し、そのパーティションに存在する任意の値を残りの 1 つのパーティションにマージします。 RANGE (boundary_value) は、削除するパーティションの既存の境界値である必要があります。 この引数は、最初に boundary_value を保持していたファイルグループを、残りのパーティションがそれを使用しない場合、または NEXT USED プロパティでマークしない場合を除き、パーティション構成から削除します。 マージされたパーティションは、最初に boundary_value を保持していなかったファイル グループに存在します。
boundary_value は定数式であり、変数 (ユーザー定義型変数を含む) または関数 (ユーザー定義関数を含む) を参照できます。 TransactSQL 式を参照することはできません。
boundary_value は、対応するパーティション分割列のデータ型と一致するか、パーティション分割列のデータ型に暗黙的に変換される必要があります。 また、明示的な変換中に、値のサイズおよびスケールが対応する input_parameter_type のものと一致しない方法で boundary_value を切り詰めることはできません。
注意
列ストア インデックスに関する制限:列ストア インデックスを含む 2 つの空でないパーティションをマージすることはできません。 この操作を実行する前に、列ストア インデックスを削除するか無効にする必要があります
推奨する運用方法
空のパーティションは、常にパーティションの範囲の両端に保持します。 パーティションの分割やパーティションのマージによりデータ移動が発生しないように、パーティションを両端に保持します。 パーティションの分割は最初に発生し、パーティションのマージは最後に発生します。 設定されたパーティションが分割またはマージされないようにします。 データが入力されているパーティションの分割やマージは効率的でなくなることがあります。 非効率になる理由は、分割やマージによりログの生成が最大で 4 倍になり、大量のロックが発生する場合があるためです。
パーティションを複数のファイル グループに配置する主な理由は、パーティションのバックアップと復元操作を個別に実行できるようにすることです。 ファイル グループとパーティション分割戦略の詳細については、「ファイル グループ」を参照してください。
制限事項と制約事項
ALTER PARTITION FUNCTION 関数を単一の原子操作で使うテーブルやインデックスを再分割します。 しかし、この操作はオフラインで実行され、分割し直すエクステントによってはリソースを大きく消費する場合があります。
ALTER PARTITION FUNCTIONは1つのパーティションを2つに分割するか、2つのパーティションを1つに統合する場合にのみ使ってください。 他のパーティション分割方法でテーブルを変更する (たとえば、10 のパーティションを 5 つにする) には、次のいずれかを実行します。 システムの構成に応じて、これらの方法のリソース消費量は異なる場合があります。
必要なパーティション関数を使用して新しいパーティション テーブルを作成します。 そして、古いテーブルのデータを INSERT INTO... を使って新しいテーブルに挿入します。SELECT FROM文。
パーティション分割されたクラスター化インデックスを、ヒープ上に作成します。
注意
パーティション分割されたクラスター化インデックスを削除すると、パーティション分割されたヒープが生成されます。
既存の分割インデックスを、DROP EXISTING = ON節の付けた Transact-SQL CREATE INDEX 文を使って削除・再構築します。
ALTER PARTITION FUNCTION文の連続を実行します。
ALTER PARTITION FUNCTIONの影響を受けるすべてのファイル グループはオンラインである必要があります。
ALTER PARTITION FUNCTION パーティション関数を使用するテーブルに無効化されたクラスタインデックスが存在する場合に失敗します。
データベース エンジンは、パーティション関数の変更に関するレプリケーションをサポートしていません。 パブリケーション データベース内のパーティション関数への変更は、手動でサブスクリプション データベースに適用する必要があります。
アクセス許可
次のいずれかのアクセス許可を使用して、 ALTER PARTITION FUNCTIONを実行できます。
ALTER ANY DATASPACE 権限。 この権限は、既定では sysadmin 固定サーバー ロール、 db_owner 固定データベース ロール、および db_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);
次のステップ
テーブルのパーティション分割と関連する概念の詳細については、次の記事を参照してください。