パーティション関数を変更する
適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Transact-SQL を使用して、SQL Server、Azure SQL Database、Azure SQL Managed Instanceでテーブルまたはインデックスをパーティション分割する方法を変更するには、パーティション テーブルまたはインデックスのパーティション関数で、指定されたパーティション数を 1 ずつ加算または減算します。 パーティションを追加するには、既存のパーティションを 2 つのパーティションに分割し、新しいパーティションの境界を再定義します。 パーティションを削除するには、2 つのパーティションの境界を 1 つのパーティションにマージします。 この最後の操作により、1 つのパーティションが再作成され、もう 1 つのパーティションは未割り当てのままになります。 パーティション関数を変更する前に 、ベスト プラクティス を確認してください。
注意事項
複数のテーブルやインデックスで同じパーティション関数を使用できます。 パーティション関数を変更すると、1 回のトランザクションでそれらのテーブルやインデックスすべてに影響します。 変更する前に 、パーティション関数の依存関係 を確認してください。
テーブルのパーティション分割は、Azure Synapse Analytics の専用 SQL プールでも使用でき、構文の違いがいくつかあります。 詳細については、「 専用 SQL プールでのテーブルのパーティション分割」を参照してください。
制限事項
ALTER PARTITION FUNCTION は、1 つのパーティションを 2 つに分割するか、または 2 つのパーティションを 1 つにマージする目的にのみ使用できます。 テーブルまたはインデックスのパーティション分割方法を変更する (たとえば 10 個のパーティションから 5 個のパーティションに変更する) には、次のいずれかの方法を使用できます。
目的のパーティション関数を使用して新しいパーティション テーブルを作成し、INSERT INTO ... を使用して古いテーブルのデータを新しいテーブルに挿入します。SELECT FROM Transact-SQL ステートメントまたは SQL Server Management Studio (SSMS) のパーティション管理ウィザード。
ヒープにパーティション 分割されたクラスター化インデックス を作成します。
注意
パーティション分割されたクラスター化インデックスを削除すると、パーティション分割されたヒープが生成されます。
TRANSACT-SQL CREATE INDEX ステートメントと DROP EXISTING = ON 句を使用して、既存のパーティション インデックスを削除して再構築します。
一連の ALTER PARTITION FUNCTION ステートメントを実行します。
データベース エンジンでは、パーティション関数の変更に対するレプリケーションのサポートは提供されません。 パブリケーション データベースのパーティション関数に変更を加える場合は、サブスクリプション データベースでこの操作を手動で実行する必要があります。
ALTER PARTITION FUNCTION の影響を受けるすべてのファイル グループは、オンラインである必要があります。
アクセス許可
次の権限のいずれかを使用すると、ALTER PARTITION FUNCTION を実行できます。
ALTER ANY DATASPACE 権限。 この権限は、既定では sysadmin 固定サーバー ロール、 db_owner 固定データベース ロール、および db_ddladmin 固定データベース ロールのメンバーに与えられています。
パーティション関数が作成されたデータベースでの CONTROL または ALTER 権限。
パーティション関数が作成されたデータベースのサーバーでの CONTROL SERVER または ALTER ANY DATABASE 権限。
データベース内のパーティション 分割されたオブジェクトに対してクエリを実行する
次のクエリは、データベース内のすべてのパーティション 分割されたオブジェクトを一覧表示します。 これを使用して、パーティション関数の依存関係を変更する前にチェックできます。
SELECT
PF.name AS PartitionFunction,
ds.name AS PartitionScheme,
OBJECT_SCHEMA_NAME(si.object_id) as SchemaName,
OBJECT_NAME(si.object_id) AS PartitionedTable,
si.name as IndexName
FROM sys.indexes AS si
JOIN sys.data_spaces AS ds
ON ds.data_space_id = si.data_space_id
JOIN sys.partition_schemes AS PS
ON PS.data_space_id = si.data_space_id
JOIN sys.partition_functions AS PF
ON PF.function_id = PS.function_id
WHERE ds.type = 'PS'
AND OBJECTPROPERTYEX(si.object_id, 'BaseType') = 'U'
ORDER BY PartitionFunction, PartitionScheme, SchemaName, PartitionedTable;
Transact-SQL を使用してパーティションを分割する
オブジェクト エクスプローラーで、ターゲット データベースに接続します。
標準バーで、 [新しいクエリ] を選択します。
次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。
この例では次のとおりです。
- 以前のバージョンのパーティション関数
myRangePF1
を確認し、見つかった場合は削除します。 - テーブルを 4 つのパーティションにパーティション分割する というパーティション
myRangePF1
関数を作成します。 - パーティションを boundary_values 100 から 1000 に分割して、boundary_values 100 と 500 の間にパーティションを作成し、パーティションを 500 から 1000 boundary_values間に作成します。
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 ALTER PARTITION FUNCTION myRangePF1 () SPLIT RANGE (500);
- 以前のバージョンのパーティション関数
Transact-SQL を使用して 2 つのパーティションをマージする
オブジェクト エクスプローラーで、ターゲット データベースに接続します。
標準バーで、 [新しいクエリ] を選択します。
次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。
この例では次のとおりです。
- 以前のバージョンのパーティション関数
myRangePF1
が存在するかどうかを確認し、見つかった場合は削除します。 - 3 つの境界値を持つ というパーティション
myRangePF1
関数を作成します。これにより、4 つのパーティションが作成されます。 - boundary_values 1 と 100 の間のパーティションを、boundary_values 100 から 1,000 の間のパーティションとマージします。
- その結果、パーティション関数
myRangePF1
は 1 と 1,000 の 2 つの境界ポイントを持ちます。
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 ALTER PARTITION FUNCTION myRangePF1 () MERGE RANGE (100);
- 以前のバージョンのパーティション関数
SSMS を使用してパーティション関数を削除する
オブジェクト エクスプローラーで、ターゲット データベースに接続します。
パーティション関数を削除するデータベースを展開し、 ストレージ フォルダーを展開します。
パーティション関数 フォルダーを展開します。
削除するパーティション関数を右クリックして、 [削除]をクリックします。
[ オブジェクトの削除 ] ダイアログ ボックスで、正しいパーティション関数が選択されていることを確認し、[ OK] を選択します。
次のステップ
関連する概念の詳細については、次の記事を参照してください。