パーティション関数の変更
適用対象: SQL Server
Azure SQL データベース
Azure SQL Managed Instance
SQL Server、Azure SQL Database、および Azure SQL Managed Instance でのテーブルまたはインデックスのパーティション分割方法を変更する場合は、Transact-SQL を使用して、パーティション テーブルまたはパーティション インデックスのパーティション関数で、指定するパーティションの数を 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 から 1,000 までのパーティションを分割して、boundary_values が 100 から 500 までのパーティションと、boundary_values が 500 から 1,000 までのパーティションを作成します。
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
には 2 つの境界点 (1 と 1,000 ) が存在することになります。
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] を選択します。
次のステップ
関連する概念の詳細については、次の記事を参照してください。