パーティション テーブルとパーティション インデックスのレプリケート

適用対象: SQL Server Azure SQL Managed Instance

大きなテーブルやインデックスをパーティション分割すると、データのサブセットに対するアクセスや管理を迅速かつ効率的に行うと同時に、データ コレクションの整合性を維持することができるので、大きなテーブルやインデックスを管理しやすくなります。 詳細については、「 Partitioned Tables and Indexes」を参照してください。 レプリケーションでは、パーティション テーブルとパーティション インデックスを扱う方法を指定するプロパティ セットによって、パーティション分割をサポートします。

トランザクション レプリケーションおよびマージ レプリケーションのアーティクルのプロパティ

次の表に、データのパーティション分割に使用されるオブジェクトを示します。

Object 作成に使用するステートメント
パーティション テーブルまたはパーティション インデックス CREATE TABLE または CREATE INDEX
パーティション関数 CREATE PARTITION FUNCTION
[パーティション構成] CREATE PARTITION SCHEME

パーティション分割のプロパティは、パーティション分割するオブジェクトをサブスクライバーにコピーするかどうかを指定するアーティクルのスキーマ オプションです。 これらのスキーマ オプションは次の方法で設定できます。

  • パブリケーションの新規作成ウィザードの [アーティクルのプロパティ] ページ、または [パブリケーションのプロパティ] ダイアログ ボックス。 上記の表に示したオブジェクトをコピーするには、 [テーブル分割構成のコピー] プロパティと [インデックス分割構成のコピー] プロパティに、値 trueを指定します。 [アーティクルのプロパティ] ページへのアクセス方法については、「View and Modify Publication Properties」 (パブリケーション プロパティの表示および変更) を参照してください。

  • 次のいずれかのストアド プロシージャの schema_option パラメーターの使用。

    上記の表に示したオブジェクトをコピーするには、適切なスキーマ オプション値を指定します。 スキーマ オプションを指定する方法については、「 Specify Schema Options」を参照してください。

レプリケーションでは、初期同期中にオブジェクトがサブスクライバーにコピーされます。 パーティション構成で PRIMARY 以外のファイル グループを使用する場合、そのファイル グループは初期同期の前にサブスクライバーに存在している必要があります。

サブスクライバーが初期化された後、データ変更がサブスクライバーに反映され、適切なパーティションに適用されます。 ただし、パーティション構成に対する変更はサポートされていません。 トランザクション レプリケーションとマージ レプリケーションでは、ALTER PARTITION FUNCTION コマンド、ALTER PARTITION SCHEME コマンド、ALTER INDEX コマンドの REBUILD WITH PARTITION ステートメントのレプリケートはサポートされません。 これらに関連付けられた変更は、サブスクライバーに自動的にレプリケートされません。 ユーザーがサブスクライバー側で同様の変更を手動で行う必要があります。

レプリケーションによるパーティション切り替えのサポート

テーブル分割の主な利点の 1 つは、パーティション間でデータのサブセットをすばやく効率的に移動できることです。 データは SWITCH PARTITION コマンドを使用して移動します。 既定では、テーブルのレプリケーションが有効な場合、SWITCH PARTITION 操作は次の理由でブロックされます。

  • パブリッシャーに存在するテーブルを移動元または移動先としてデータを移動する場合に、そのデータがサブスクライバーに存在しないと、パブリッシャーとサブスクライバーの間で不整合が発生します。 この問題は、一般に、ステージング テーブルにかかわるデータの移動で発生します。

  • サブスクライバーにパブリッシャーとは異なるパーティション テーブルの定義がある場合、ディストリビューション エージェントが変更をサブスクライバーに適用しようとすると失敗します。

このような問題が発生する可能性はありますが、トランザクション レプリケーションでパーティション切り替えを有効にすることができます。 パーティション切り替えを有効にする前に、パーティション切り替えに関連するすべてのテーブルがパブリッシャーとサブスクライバーに存在し、テーブル定義およびパーティション定義が同じであることを確認してください。

パブリッシャーとサブスクライバーでパーティションにまったく同じパーティション構成が使用されている場合は、パブリッシャーへのパーティション切り替えステートメントのレプリケートのみを行う allow_partition_switch と共に、replication_partition_switch を有効にすることができます。 DDL をレプリケートしないで、 allow_partition_switch を有効にすることもできます。 これは、過去の月をパーティションからロール アウトする一方、バックアップの目的で、レプリケートしたパーティションをサブスクライバーにもう 1 年保持する場合に便利です。

SQL Server 2008 R2 から現在のバージョンまででパーティション切り替えを有効にすると、近い将来、分割操作とマージ操作が必要になる可能性があります。 レプリケートされたまたは CDC が有効なテーブルでの分割またはマージ操作を実行する前に、該当するパーティションに保留中のレプリケートされたコマンドがないことを確認します。 分割操作とマージ操作中にパーティションで DML 操作が実行されないようにする必要もあります。 ログ リーダーでも CDC キャプチャ ジョブでも処理されていないトランザクションがある場合や、分割操作またはマージ操作中に、レプリケートされたまたは CDC が有効なテーブルのパーティションで DML 操作が実行される場合 (同じパーティションに関連する場合)、ログ リーダー エージェントで処理エラー (エラー 608 - パーティション ID のカタログ エントリが見つからない) が発生する可能性があります。 このエラーを修正するには、サブスクリプションを再初期化するまたはそのテーブルまたはデータベース上で CDC を無効にすることが必要になる場合があります。

サポートされていないシナリオ

次のシナリオは、パーティション切り替えでレプリケーションを使用しているときはサポートされません。

ピア ツー ピア レプリケーション
パーティション切り替えでピア ツー ピア レプリケーションはサポートされていません。

パーティション切り替えでの変数の使用

トランザクション レプリケーションまたは変更データ キャプチャ (CDC) を使用してパブリッシュされたテーブルでのパーティション切り替えに変数を使用することは、ALTER TABLE ... SWITCH TO ... PARTITION ... ステートメントではサポートされていません。

たとえば、次のパーティション切り替えコードは、データベースで有効になっている CDC やトランザクション パブリケーションに参加している TableA では機能しません。

DECLARE @SomeVariable INT = $PARTITION.pf_test(10);
ALTER TABLE dbo.TableA
SWITCH TO dbo.TableB 
PARTITION @SomeVariable;

代わりに、次の例のように、パーティション関数を直接使用してパーティションを切り替えます。

ALTER TABLE NonPartitionedTable 
SWITCH TO PartitionedTable PARTITION $PARTITION.pf_test(10);

パーティション切り替えの有効化

トランザクション パブリケーションの次のプロパティを使用すると、レプリケーション環境でのパーティション切り替えの動作を制御できます。

  • @allow_partition_switchtrue に設定すると、パブリケーション データベースに対して SWITCH PARTITION を実行できます。

  • @replicate_partition_switch では、SWITCH PARTITION DDL ステートメントをサブスクライバーにレプリケートするかどうかを決定します。 このオプションは、@allow_partition_switchtrue に設定されている場合にのみ有効です。

これらのプロパティは、パブリケーションの作成時に sp_addpublication を使用するか、パブリケーションの作成後に sp_changepublication を使用することによって設定できます。 既に述べたとおり、マージ レプリケーションではパーティション切り替えがサポートされません。 マージ レプリケーションが有効になっているテーブルで SWITCH PARTITION を実行するには、パブリケーションからテーブルを削除します。