パーティション テーブルとパーティション インデックスの作成

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

SQL Server Management Studio または Transact-SQL を使用して、SQL Server、Azure SQL Database、および Azure SQL Managed Instance にパーティション テーブルまたはインデックスを作成できます。 パーティション テーブルとインデックス内のデータは、データベース内の複数のファイル グループに分散したり、単一のファイル グループに格納したりできる単位に行方向に分割されます。 パーティション分割により、大規模なテーブルとインデックスの管理の可能性と拡張性が向上します。

一般に、パーティション テーブルまたはインデックスの作成は、次の 3 つまたは 4 つの部分で実行されます。

  1. オプションで、パーティション スキームで指定されたパーティションを保持するファイル グループを作成またはファイル グループと対応するデータ ファイルを作成します。 複数のファイル グループにパーティションを配置する主な理由は、ファイル グループに対してバックアップおよび復元操作を個別に実行できるようにするためです。 これが必要でない場合は、PRIMARY などの既存のファイル グループを使用するか、関連するデータ ファイルを含む新しいファイル グループを使用して、すべてのパーティションを 1 つのファイル グループに割り当てることを選択できます。 ほぼすべてのシナリオで、複数のファイル グループを使用するかどうかに関係なく、パーティション分割のすべての利点をが得られます。

  2. テーブルまたはインデックスの行を指定された列の値に基づいてパーティションにマップするパーティション関数を作成します。 1 つのパーティション関数で、複数のオブジェクトをパーティション分割できます。

  3. パーティション テーブルまたはインデックスのパーティションを 1 つまたは複数のファイル グループにマップする パーティション スキーム を作成します。 1 つのパーティション構成を使用して、複数のオブジェクトをパーティション分割できます。

  4. テーブルまたはインデックスを作成または変更し、パーティション構成をストレージの場所として指定し、パーティション分割列として機能する列を指定します。

注意

パーティション分割は、Azure SQL Database で完全にサポートされています。 Azure SQL Database では PRIMARY ファイル グループのみがサポートされているため、すべてのパーティションを PRIMARY ファイル グループに配置する必要があります。

テーブルのパーティション分割は、Azure Synapse Analytics の専用 SQL プールでも使用でき、構文の違いがいくつかあります。 詳細については、 「専用 SQL プールでのテーブルのパーティション分割」に関するページを参照してください。

アクセス許可

パーティション テーブルを作成するには、データベースでの CREATE TABLE 権限と、テーブルを作成する構成に対する ALTER 権限が必要です。 パーティション インデックスを作成するには、インデックスを作成するテーブルまたはビューに対する ALTER 権限が必要です。 パーティション テーブルまたはパーティション インデックスを作成するには、次の追加の権限のいずれかが必要です。

  • ALTER ANY DATASPACE 権限。 この権限は、既定では sysadmin 固定サーバー ロール、 db_owner 固定データベース ロール、および db_ddladmin 固定データベース ロールのメンバーに与えられています。

  • パーティション関数およびパーティション構成を作成するデータベースに対する CONTROL 権限または ALTER 権限。

  • パーティション関数およびパーティション構成を作成するデータベースのサーバーに対する CONTROL SERVER 権限または ALTER ANY DATABASE 権限。

Transact-SQL を使用して 1 つのファイル グループにパーティション テーブルを作成する

ファイル グループに対してバックアップ操作と復元操作を個別に実行する必要がない場合は、1 つのファイル グループを使用してテーブルをパーティション分割すると、時間の経過に伴うパーティション テーブルの管理が簡略化されます。

この例は、ファイルとファイル グループの追加をサポートしていない Azure SQL Database に適しています。 Azure SQL Database では、PRIMARY ファイル グループにパーティションを作成することでテーブルのパーティション分割がサポートされています。 SQL Server と Azure SQL Managed Instance の場合は、ファイル グループとファイル管理のプラクティスに応じて、ユーザーが作成したファイル グループを指定できます。

この例では、Transact-SQL を使用して SQL Server Management Studio (SSMS) でパーティション テーブルを作成し、すべてのパーティションを PRIMARY ファイル グループに割り当てます。 この例では、次の処理を実行します。

  • datetime2 データ型を使用して、3 つの境界値を持つ myRangePF1 という名前の RANGE RIGHT パーティション関数 を作成します。 3 つの境界値により、4 つのパーティションを持つパーティション テーブルが作成されます。
  • ALL TO 構文を使用して myRangePF1 パーティション関数内のすべてのパーティションを PRIMARY ファイル グループに割り当てる myRangePS1 という名前のパーティション スキームを作成します。
  • myRangePS1 パーティション構成上に PartitionTable という名前のテーブルを作成し、パーティション分割列として col1 という名前の列を指定します。
  1. オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。

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

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。 この例では、パーティション関数とパーティション構成を作成します。 パーティション構成を格納場所として指定した新しいテーブルが作成されます。

CREATE PARTITION FUNCTION myRangePF1 (datetime2(0))  
    AS RANGE RIGHT FOR VALUES ('2022-04-01', '2022-05-01', '2022-06-01') ;  
GO  

CREATE PARTITION SCHEME myRangePS1  
    AS PARTITION myRangePF1  
    ALL TO ('PRIMARY') ;  
GO  

CREATE TABLE dbo.PartitionTable (col1 datetime2(0) PRIMARY KEY, col2 char(10))  
    ON myRangePS1 (col1) ;  
GO

Transact-SQL を使用して複数のファイル グループにパーティション テーブルを作成する

このセクションの手順に従って、SSMS で Transact-SQL を使用して 1 つ以上のファイル グループ、対応するファイル、およびパーティション テーブルを作成します。

SQL Server と Azure SQL Managed Instance の両方で、ファイル グループとファイルの作成がサポートされています。 Azure SQL Managed Instance では、追加されたすべてのデータベース ファイルのパスが自動的に構成されるため、Azure SQL Managed Instance の ALTER DATABASE ADD FILE コマンドでは FILENAME パラメーターを使用できません。 Azure SQL Database では、PRIMARY ファイル グループ内でのパーティション テーブルの作成のみがサポートされています。 Azure SQL Database のコード例については、「Transact-SQL を使用して 1 つのファイル グループにパーティション テーブルを作成する」を参照してください

空のデータベースに対して次の例を実行します。 この例では、次の処理を実行します。

  • データベースに 4 つの新しいファイル グループを追加します。
  • 各ファイル グループに 1 つのファイルを追加します。
  • テーブルを 4 つのパーティションに分割する 3 つの境界値を使用して、myRangePF1 という RANGE RIGHT パーティション関数を作成します。
  • myRangePF1 を 4 つの新しいファイル グループに適用する myRangePS1 というパーティション スキームを作成します。
  • myRangePS1 を使用して col1 をパーティション化する PartitionTable というパーティション テーブルを作成します。
  1. オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。

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

  3. この例では、新しいデータベースを作成して使用します。 次に、新しいファイル グループ、パーティション関数、およびパーティション 構成を作成します。 パーティション構成を格納場所として指定した新しいテーブルが作成されます。 次の例をコピーし、クエリ ウィンドウに貼り付けます。

    マネージド インスタンスを使用している場合は、FILENAME パラメーターと関連する値をALTER DATABASE ADD FILE コマンドから削除します。 マネージド インスタンスによって、自動的にファイル パスが決定されます。

    SQL Server インスタンスを使用している場合は、FILENAME パラメーターの値をインスタンスに適した場所にカスタマイズします。

    既存のデータベースを使用する場合は、CREATE DATABASE コマンドを削除し、USE ステートメントを適切なデータベース名に変更します。

    [実行] を選択します。

    CREATE DATABASE PartitionTest;
    GO
    
    USE PartitionTest;
    GO
    
    ALTER DATABASE PartitionTest  
    ADD FILEGROUP test1fg;  
    GO  
    ALTER DATABASE PartitionTest  
    ADD FILEGROUP test2fg;  
    GO  
    ALTER DATABASE PartitionTest  
    ADD FILEGROUP test3fg;  
    GO  
    ALTER DATABASE PartitionTest  
    ADD FILEGROUP test4fg;   
    
    ALTER DATABASE PartitionTest   
    ADD FILE   
    (  
        NAME = partitiontest1,  
        FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\partitiontest1.ndf',  
        SIZE = 5MB,  
        FILEGROWTH = 5MB  
    )  
    TO FILEGROUP test1fg;  
    ALTER DATABASE PartitionTest   
    ADD FILE   
    (  
        NAME = partitiontest2,  
        FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\partitiontest2.ndf',  
        SIZE = 5MB,  
        FILEGROWTH = 5MB  
    )  
    TO FILEGROUP test2fg;  
    GO  
    ALTER DATABASE PartitionTest   
    ADD FILE   
    (  
        NAME = partitiontest3,  
        FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\partitiontest3.ndf',  
        SIZE = 5MB,  
        FILEGROWTH = 5MB  
    )  
    TO FILEGROUP test3fg;  
    GO  
    ALTER DATABASE PartitionTest   
    ADD FILE   
    (  
        NAME = partitiontest4,  
        FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\partitiontest4.ndf',  
        SIZE = 5MB,  
        FILEGROWTH = 5MB  
    )  
    TO FILEGROUP test4fg;  
    GO  
    
    CREATE PARTITION FUNCTION myRangePF1 (datetime2(0))  
        AS RANGE RIGHT FOR VALUES ('2022-04-01', '2022-05-01', '2022-06-01') ;  
    GO  
    
    CREATE PARTITION SCHEME myRangePS1  
        AS PARTITION myRangePF1  
        TO (test1fg, test2fg, test3fg, test4fg) ;  
    GO  
    
    CREATE TABLE PartitionTable (col1 datetime2(0) PRIMARY KEY, col2 char(10))  
        ON myRangePS1 (col1) ;  
    GO  
    

SSMS を使用してテーブルをパーティション分割する

このセクションの手順に従って、必要に応じてファイル グループと対応するファイルを作成し、SQL Server Management Studio (SSMS) の「パーティション作成ウィザード」を使用してパーティション テーブルを作成するか、既存のテーブルをパーティション分割します。 パーティションの作成ウィザード は、SQL Server と Azure SQL Managed Instance の SSMS で使用できます。 Azure SQL Database については、「Transact-SQL を使用して 1 つのファイル グループにパーティション テーブルを作成する」を参照してください。

新しいファイル グループを作成する (省略可能)

パーティション テーブルを 1 つ以上の新しい ファイル グループに配置する場合は、このセクションの手順に従います。 SQL Server と Azure SQL Managed Instance の両方で、ファイル グループとファイルの作成がサポートされています。 Azure SQL Managed Instance の場合、作成されたすべてのファイルのパスが自動的に構成されます。

  1. オブジェクト エクスプローラーで、パーティション テーブルを作成するデータベースを右クリックし、 [プロパティ]を選択します。

  2. [データベースのプロパティ -database_name] ダイアログ ボックスの [ページの選択] で、[ファイル グループ] を選択します。

  3. [行][追加] を選択します。 新しい行に、ファイル グループ名を入力します。

    警告

    パーティションの作成時にファイル グループを複数指定する場合は、境界値に指定したファイル グループの数より 1 つ多い数のファイル グループが常に必要です。

  4. 行の追加を繰り返して、パーティション テーブルのすべてのファイル グループを作成します。

  5. [OK] を選択します。

  6. [ページの選択]で、 [ファイル]を選択します。

  7. [行][追加] を選択します。 新しい行にファイル名を入力し、ファイル グループを選択します。

  8. 行の追加を繰り返して、各ファイル グループに少なくとも 1 つのファイルを作成します。

パーティション テーブルを作成します。

  1. 必要に応じて、[テーブル] フォルダーを展開し、通常と同じようにテーブルを作成します。 詳しくは、「テーブルの作成 (データベース エンジン)」を参照してください。 または、次のステップで既存のテーブルを指定することもできます。

  2. パーティション分割するテーブルを右クリックし、[ストレージ] をポイントします。次に、[パーティションの作成] を選択します。

  3. パーティションの作成ウィザード[パーティションの作成ウィザードへようこそ] ページで、 [次へ]を選択します。

  4. [パーティション分割列の選択] ページの [使用可能なパーティション分割列] グリッドで、テーブルのパーティション分割に使用する列を選択します。 [使用可能なパーティション分割列] グリッドには、データのパーティション分割に使用できるデータ型の列だけが表示されます。 計算列をパーティション分割列として選択する場合は、列を PERSISTED として作成する必要があります。

    パーティション分割列とその値の範囲の選択肢は、主に、データをどの程度論理的にグループ化できるかによって決まります。 たとえば、月や四半期に基づいてデータを論理グループに分割することができます。 この論理グループがテーブル パーティションの管理に適しているかどうかは、データに対してどのようなクエリを実行する予定かによって決まります。 すべてのデータ型は、 textntextimagexmltimestampvarchar(max)nvarchar(max)varbinary(max)、別名データ型、または CLR ユーザー定義データ型を除いて、列を分割して使用することができます。

    このページで使用できる他のオプションを次に示します。

    [このテーブルを選択したパーティション テーブルに併置する]
    パーティション分割列でこのテーブルと連結する関連データが含まれている、パーティション テーブルを選択できます。 通常、テーブルのパーティションをパーティション分割列で連結すると、クエリの効率が向上します。

    [一意でないインデックスと一意のインデックスをインデックス付きパーティション列にストレージ固定]
    同じパーティション構成でパーティション分割されたテーブルのすべてのインデックスを固定します。 テーブルとインデックスを固定すると、データが同じ方法でパーティション分割されるため、パーティションをパーティション テーブル内外に効果的に移動できるようになります。

    パーティション分割列とその他のオプションを選択したら、 [次へ]を選択します。

  5. [パーティション関数の選択] ページの [パーティション関数の選択] で、 [新しいパーティション関数] または [既存のパーティション関数]を選択します。 [新しいパーティション関数]を選択した場合は、関数の名前を入力します。 [既存のパーティション関数] を選択した場合は、使用する関数の名前を一覧から選択します。 データベースに他のパーティション関数がない場合、 [既存のパーティション関数] オプションは使用できません。

    このページを完了したら、 [次へ] を選択します。

  6. [パーティション構成の選択] ページの [パーティション構成の選択]で、 [新しいパーティション構成] または [既存のパーティション構成]を選択します。 [新しいパーティション構成]を選択した場合は、構成の名前を入力します。 [既存のパーティション構成] を選択した場合は、使用する構成の名前を一覧から選択します。 データベースに他のパーティション構成がない場合、 [既存のパーティション構成] オプションは使用できません。

    このページを完了したら、 [次へ] を選択します。

  7. [マップ パーティション] ページの [範囲] で、左境界または右境界を選択します。 左境界 は、最大境界値がパーティション内になるように指定します。 右境界 は、最小境界値がパーティション内になるように指定します。 パーティション関数の両境界の範囲の詳細について説明します。

    複数の境界ポイントを指定する場合は、ファイル グループに境界値を割り当てる行に加えて、必ず追加の行を 1 行入力する必要があります。

    [ファイル グループを選択して境界値を指定します] グリッドの [ファイル グループ]で、データをパーティション分割するファイル グループを選択します。 [境界]で、各ファイル グループの境界値を入力します。 複数またはすべてのパーティションを同じファイル グループに割り当てる場合は、各行に同じファイル グループ名を選択します。 単一行のファイル グループを選択し、境界値が空のままの場合、パーティション関数はパーティション関数名を使用してテーブル全体またはインデックス全体を単一のパーティションにマップします。 

    このページで使用できる他のオプションを次に示します。

    [境界の設定]
    [境界値の設定] ダイアログ ボックスを開き、パーティションの境界値と日付範囲を選択します。 このオプションは、 datedatetimesmalldatetimedatetime2、または datetimeoffsetのいずれかのデータ型を含むパーティション分割列を選択した場合にのみ使用できます。

    [ストレージの推定]
    パーティションに指定された各ファイル グループのストレージの行数、必要な領域、および使用できる領域を推定します。 これらの値は、読み取り専用の値としてグリッドに表示されます。

    [境界値の設定] ダイアログ ボックスでは、次の追加オプションを設定できます。

    開始日
    パーティションの範囲値の開始日を選択します。

    終了日
    パーティションの範囲値の終了日を選択します。 [パーティションのマップ] ページで [左側の境界] を選択した場合、この日付は、各ファイル グループまたはパーティションの最後の値になります。 [パーティションのマップ] ページで [右側の境界] を選択した場合、この日付は、最後から 2 番目のファイル グループの最初の値になります。

    日付範囲
    各パーティションの日付粒度または範囲値の増分を選択します。

    このページを完了したら、 [次へ] を選択します。

  8. [出力オプションの選択] ページで、パーティション テーブルを完了する方法を指定します。 ウィザードの前のページに基づいて SQL スクリプトを作成するには、 [スクリプトの作成] を選択します。 ウィザードの残りのすべてのページが完了した後に新しいパーティション テーブルを作成するには、 [すぐに実行する] を選択します。 事前に定義した時刻に新しいパーティション テーブルを作成するには、 [スケジュール] を選択します。

    [スクリプトの作成] を選択した場合、 [スクリプト オプション] で次のオプションを使用できます。

    [スクリプトをファイルに保存]
    スクリプトを .sql ファイルとして生成します。 [ファイル名] ボックスにファイルの名前と場所を入力するか、 [参照] を選択して [スクリプト ファイルの場所] ダイアログ ボックスを開きます。 [名前を付けて保存] で、 [Unicode テキスト] または [ANSI テキスト] を選択します。

    [スクリプトをクリップボードに保存]
    スクリプトをクリップボードに保存します。

    [スクリプトを新しいクエリ ウィンドウに保存]
    新しいクエリ エディター ウィンドウにスクリプトを生成します。 これは既定値です。

    [スケジュール] を選択した場合は、 [スケジュールの変更] を選択します。

    1. [新しいジョブ スケジュール] ダイアログ ボックスで、 [名前] ボックスに、ジョブのスケジュールの名前を入力します。

    2. [スケジュールの種類] ボックスで、スケジュールの種類を選択します。

      • [SQL Server エージェントの開始時に自動的に開始]

      • [CPU がアイドル状態になったときに開始]

      • [定期的] 。 新しいパーティション テーブルを新しい情報で定期的に更新するには、このオプションを選択します。

      • [指定日時] 。 これは既定値です。

    3. [有効] チェック ボックスをオンまたはオフにして、スケジュールを有効または無効にします。

    4. [定期的] を選択した場合:

      1. [頻度][実行] ボックスの一覧で、実行の頻度を指定します。

        • [日単位] を選択した場合は、 [間隔] ボックスに、ジョブ スケジュールを繰り返す頻度を日単位で入力します。

        • [週単位] を選択した場合は、 [間隔] ボックスに、ジョブ スケジュールを繰り返す頻度を週単位で入力します。 ジョブ スケジュールを実行する曜日を選択します。

        • [月単位] を選択した場合は、 [日] または [曜日] を選択します。

          • [日] を選択した場合は、ジョブ スケジュールを実行する日付と、ジョブ スケジュールを繰り返す頻度を月単位で指定します。 たとえば、隔月の 15 日にジョブ スケジュールを実行する場合は、 [日] を選択し、1 番目のボックスに「15」と入力し、2 番目のボックスに「2」と入力します。 2 番目のボックスで使用できる最大値は "99" です。

          • [曜日] を選択した場合は、ジョブ スケジュールを実行する曜日と、ジョブ スケジュールを繰り返す頻度を月単位で指定します。 たとえば、隔月の最後の平日にジョブ スケジュールを実行する場合は、 [日] を選択し、リストから [最終] を選択します。次に 2 番目のリストから [平日] を選択し、最後のボックスに「2」と入力します。 [第 1][第 2][第 3] 、または [第 4] も、特定の平日 (たとえば、日曜日や水曜日) に加えて、最初の 2 つのリストから選択できます。 最後のボックスで使用できる最大値は "99" です。

      2. [一日のうちの頻度] で、頻度、ジョブ スケジュールを実行する当日にジョブ スケジュールを繰り返す頻度を指定します。

        • [1 回] を選択した場合は、ジョブ スケジュールを実行する特定の時刻を [1 回] ボックスに入力します。 間、分、秒に加え、午前か午後かを入力します。

        • [間隔] を選択した場合は、 [頻度] で選択した日にジョブ スケジュールを実行する頻度を指定します。 たとえば、ジョブ スケジュールを実行する当日に 2 時間おきにジョブ スケジュールを実行する場合は、 [間隔] を選択し、1 番目のボックスに「2」と入力してから、 [時間] を選択します。 このリストでは、 [分][秒] を選択することもできます。 1 番目のボックスで使用できる最大値は "100" です。

          [開始] ボックスに、ジョブ スケジュールの実行を開始する時刻を入力します。 [終了] ボックスに、ジョブ スケジュールの実行を終了する時刻を入力します。 間、分、秒に加え、午前か午後かを入力します。

      3. [期間] で、 [開始日] に、ジョブ スケジュールの実行を開始する日付を入力します。 [終了日] を選択します。ジョブ スケジュールの実行を停止するタイミングを指定しない場合は、 [終了日なし] を選択します。 [終了日] を選択した場合は、ジョブ スケジュールの実行を停止する日付を入力します。

    5. [指定日時] を選択した場合は、 [指定日時に発生][日付] ボックスに、ジョブ スケジュールを実行する日付を入力します。 [時刻] ボックスに、ジョブ スケジュールを実行する時刻を入力します。 間、分、秒に加え、午前か午後かを入力します。

    6. [概要][説明] で、すべてのジョブ スケジュール設定が適切であることを確認します。

    7. [OK] を選択します。

    このページを完了したら、 [次へ] を選択します。

  9. [概要の確認] ページの [選択内容の確認]で、使用可能なすべてのオプションを展開し、すべてのパーティション設定が適切であることを確認します。 すべての設定が適切であることを確認したら、 [完了] を選択します。

  10. [パーティションの作成ウィザードの進行状況] ページで、パーティションの作成ウィザードの操作に関する状態情報を監視します。 ウィザードで選択したオプションに応じて、[進行状況] ページに 1 つまたは複数のアクションが含まれる可能性があります。 上部のボックスには、ウィザードの全体的な状態と受信した状態メッセージ、エラー メッセージ、および警告メッセージの数が表示されます。

    [パーティションの作成ウィザードの進行状況] ページでは、次のオプションを使用できます。

    詳細
    アクション、状態、およびウィザードで実行したアクションから返されたメッセージが提供されます。

    操作
    各アクションの種類と名前を指定します。

    状態
    全体としてウィザードのアクションが [成功] または [失敗] のいずれの値を返したかを示します。

    メッセージ
    プロセスから返されたすべてのエラー メッセージまたは警告メッセージを提供します。

    Report
    パーティションの作成ウィザードの結果を含むレポートを作成します。 [レポートの表示][レポートをファイルに保存][レポートをクリップボードにコピー][レポートを電子メールとして送信] の各オプションがあります。

    [レポートの表示]
    パーティションの作成ウィザードの進行状況に関するテキスト レポートを表示する [レポートの表示] ダイアログ ボックスを開きます。

    [レポートをファイルに保存]
    [レポートに名前を付けて保存] ダイアログ ボックスを開きます。

    [レポートをクリップボードにコピー]
    ウィザードの進行状況レポートの結果をクリップボードにコピーします。

    [レポートを電子メールとして送信]
    ウィザードの進行状況レポートの結果を電子メール メッセージにコピーします。

    完了したら、 [閉じる] を選択します。

パーティションの作成ウィザードによってパーティション関数とパーティション構成が作成され、指定したテーブルにパーティション分割が適用されます。 テーブル パーティション分割を検証するには、オブジェクト エクスプローラーでテーブルを右クリックし、 [プロパティ]をクリックします。 [ストレージ] ページを選択します。 このページには、パーティション関数の名前および構成やパーティションの数などの情報が表示されます。

パーティション テーブルとパーティション インデックスのクエリ メタデータ

メタデータにクエリを実行して、テーブルがパーティション分割されているかどうか、パーティション テーブルの境界点、パーティション テーブルのパーティション分割列、各パーティション内の行数、および パーティションにデータ圧縮 が実装されているかどうかを確認できます。

テーブルがパーティション分割されているかどうかを決定する

次のクエリは、テーブル PartitionTable がパーティション分割されている場合、またはテーブル上の非クラスター化インデックスがパーティション分割されている場合に 1 つ以上の行を返します。 テーブルがパーティション分割されておらず、テーブルの非クラスター化インデックスがパーティション分割されていない場合、行を返しません。

SELECT SCHEMA_NAME(t.schema_id) AS SchemaName, *   
FROM sys.tables AS t   
JOIN sys.indexes AS i   
    ON t.[object_id] = i.[object_id]   
JOIN sys.partition_schemes ps   
    ON i.data_space_id = ps.data_space_id   
WHERE t.name = 'PartitionTable';   
GO  

パーティション テーブルの境界値を決定する

次のクエリでは、 PartitionTable テーブルの各パーティションの境界値を返します。

このクエリは、sys.indexestype 列を使用して、テーブルのクラスター化インデックス、またはテーブルがヒープの場合はベース テーブルの情報のみを返します。 クエリ結果にパーティション化された非クラスター化インデックスを含めるには、クエリから AND i.type <= 1 を削除またはコメント アウトします。

SELECT SCHEMA_NAME(t.schema_id) AS SchemaName, t.name AS TableName, i.name AS IndexName, 
    p.partition_number, p.partition_id, i.data_space_id, f.function_id, f.type_desc, 
    r.boundary_id, r.value AS BoundaryValue   
FROM sys.tables AS t  
JOIN sys.indexes AS i  
    ON t.object_id = i.object_id  
JOIN sys.partitions AS p  
    ON i.object_id = p.object_id AND i.index_id = p.index_id   
JOIN  sys.partition_schemes AS s   
    ON i.data_space_id = s.data_space_id  
JOIN sys.partition_functions AS f   
    ON s.function_id = f.function_id  
LEFT JOIN sys.partition_range_values AS r   
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number  
WHERE 
    t.name = 'PartitionTable' 
    AND i.type <= 1  
ORDER BY SchemaName, t.name, i.name, p.partition_number;  

パーティション テーブルのパーティション列を決定する

次のクエリでは、テーブル PartitionTable のパーティション分割列の名前が返されます。

このクエリは、sys.indexestype 列を使用して、テーブルのクラスター化インデックス、またはテーブルがヒープの場合はベース テーブルの情報のみを返します。 クエリ結果にパーティション化された非クラスター化インデックスを含めるには、クエリから AND i.type <= 1 を削除またはコメント アウトします。


SELECT   
    t.[object_id] AS ObjectID
    , SCHEMA_NAME(t.schema_id) AS SchemaName
    , t.name AS TableName   
    , ic.column_id AS PartitioningColumnID   
    , c.name AS PartitioningColumnName
    , i.name as IndexName
FROM sys.tables AS t   
JOIN sys.indexes AS i   
    ON t.[object_id] = i.[object_id]   
    AND i.[type] <= 1 -- clustered index or a heap   
JOIN sys.partition_schemes AS ps   
    ON ps.data_space_id = i.data_space_id   
JOIN sys.index_columns AS ic   
    ON ic.[object_id] = i.[object_id]   
    AND ic.index_id = i.index_id   
    AND ic.partition_ordinal >= 1 -- because 0 = non-partitioning column   
JOIN sys.columns AS c   
    ON t.[object_id] = c.[object_id]   
    AND ic.column_id = c.column_id   
WHERE t.name = 'PartitionTable';   
GO  

各パーティションで使用可能な値の範囲を記述する行を決定する

次のクエリは、テーブル PartitionTable のパーティションごとの行と、使用されているパーティション関数の比較演算子の説明を返します。 元のクエリは Kalen Delaney によって提供されました。

このクエリは、sys.indexestype 列を使用して、テーブルのクラスター化インデックス、またはテーブルがヒープの場合はベース テーブルの情報のみを返します。 クエリ結果にパーティション化された非クラスター化インデックスを含めるには、クエリから AND i.type <= 1 を削除またはコメント アウトします。

SELECT SCHEMA_NAME(t.schema_id) AS SchemaName, t.name AS TableName, i.name AS IndexName, 
    p.partition_number AS PartitionNumber, f.name AS PartitionFunctionName, p.rows AS Rows, rv.value AS BoundaryValue, 
CASE WHEN ISNULL(rv.value, rv2.value) IS NULL THEN 'N/A' 
ELSE
    CASE WHEN f.boundary_value_on_right = 0 AND rv2.value IS NULL THEN '>=' 
        WHEN f.boundary_value_on_right = 0 THEN '>' 
        ELSE '>=' 
    END + ' ' + ISNULL(CONVERT(varchar(64), rv2.value), 'Min Value') + ' ' + 
        CASE f.boundary_value_on_right WHEN 1 THEN 'and <' 
                ELSE 'and <=' END 
        + ' ' + ISNULL(CONVERT(varchar(64), rv.value), 'Max Value') 
END AS TextComparison
FROM sys.tables AS t  
JOIN sys.indexes AS i  
    ON t.object_id = i.object_id  
JOIN sys.partitions AS p  
    ON i.object_id = p.object_id AND i.index_id = p.index_id   
JOIN  sys.partition_schemes AS s   
    ON i.data_space_id = s.data_space_id  
JOIN sys.partition_functions AS f   
    ON s.function_id = f.function_id  
LEFT JOIN sys.partition_range_values AS r   
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number  
LEFT JOIN sys.partition_range_values AS rv
    ON f.function_id = rv.function_id
    AND p.partition_number = rv.boundary_id     
LEFT JOIN sys.partition_range_values AS rv2
    ON f.function_id = rv2.function_id
    AND p.partition_number - 1= rv2.boundary_id
WHERE 
    t.name = 'PartitionTable'
    AND i.type <= 1 
ORDER BY t.name, p.partition_number;

TextComparison 列には、パーティション関数の定義に基づいて、各パーティションで取り得る値の範囲が記述されます。 クエリの結果の例を次に示します。

SchemaName TableName IndexName PartitionNumber PartitionFunctionName rows BoundaryValue TextComparison
dbo PartitionTable PK_PartitionTable 1 PFTest 0 2022-03-01 00:00:00.000 >= 最小値および < 2022 年 3 月 1 日午前 12:00
dbo PartitionTable PK_PartitionTable 2 PFTest 2 2022-04-01 00:00:00.000 >= 2022 年 3 月 1 日午前 12:00 および < 2022 年 4 月 1 日午前 12:00
dbo PartitionTable PK_PartitionTable 3 PFTest 1 2022-05-01 00:00:00.000 >= 2022 年 4 月 1 日午前 12:00 および < 2022 年 5 月 1 日午前 12:00
dbo PartitionTable PK_PartitionTable 4 PFTest 0 2022-06-01 00:00:00.000 >= 2022 年 5 月 1 日午前 12:00 および < 2022 年 6 月 1 日午前 12:00
dbo PartitionTable PK_PartitionTable 5 PFTest 1 2022-07-01 00:00:00.000 >= 2022 年 6 月 1 日午前 12:00 および < 2022 年 7 月 1 日午前 12:00
dbo PartitionTable PK_PartitionTable 6 PFTest 0 NULL >= 2022 年 7 月 1 日午前 12:00 および < 最大値

制限事項

パーティション分割の制限事項とパフォーマンスに関する考慮事項については、制限事項を参照してください。

次のステップ

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