パーティション関数を変更する

適用対象:SQL ServerAzure SQL DatabaseAzure 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 を使用してパーティションを分割する

  1. オブジェクト エクスプローラーで、ターゲット データベースに接続します。

  2. 標準バーで、 [新しいクエリ] を選択します。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。

    この例では次のとおりです。

    • 以前のバージョンのパーティション関数 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 つのパーティションをマージする

  1. オブジェクト エクスプローラーで、ターゲット データベースに接続します。

  2. 標準バーで、 [新しいクエリ] を選択します。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。

    この例では次のとおりです。

    • 以前のバージョンのパーティション関数 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 を使用してパーティション関数を削除する

  1. オブジェクト エクスプローラーで、ターゲット データベースに接続します。

  2. パーティション関数を削除するデータベースを展開し、 ストレージ フォルダーを展開します。

  3. パーティション関数 フォルダーを展開します。

  4. 削除するパーティション関数を右クリックして、 [削除]をクリックします。

  5. [ オブジェクトの削除 ] ダイアログ ボックスで、正しいパーティション関数が選択されていることを確認し、[ OK] を選択します

次のステップ

関連する概念の詳細については、次の記事を参照してください。