パーティション関数の変更

適用対象:SQL ServerAzure SQL DatabaseAzure 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 によるパーティションの分割

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

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

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

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

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

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

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

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

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

    • 以前のバージョンのパーティション関数 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 によるパーティション関数の削除

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

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

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

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

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

次のステップ

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