パーティションの切り替えを使用した効率的なデータの転送

データをパーティション分割すると、データ コレクション全体の整合性を保ちながら、データ サブセットの管理とアクセスを迅速かつ効率的に行えるようになります。Transact-SQL ALTER TABLE...SWITCH ステートメントを使用すると、次のように、データのサブセットをすばやく効率的に転送できます。

  • テーブルを既存のパーティション テーブルのパーティションとして割り当てます。

  • パーティション テーブル間でパーティションを切り替えます。

  • パーティションを再割り当てし、1 つのテーブルを形成します。

パーティションの切り替えの概念についてと、パーティションの切り替えを実装しているサンプル コードについては、「Readme_SlidingWindow」を参照してください。

パーティションの切り替えの一般的な要件

パーティションを転送したとき、データは物理的には移動されません。データの場所に関するメタデータのみが変更されます。パーティションを切り替えるための一般的な要件は以下のとおりです。

  • SWITCH 操作を実行する前に、両方のテーブルを用意しておく。切り替え操作を実行するには、パーティションの転送元 (ソース テーブル) と転送先 (ターゲット テーブル) がデータベースに作成されている必要があります。

  • 転送先のパーティションが存在し、空になっていること。テーブルをパーティションとして既存のパーティション テーブルに追加するか、あるパーティション テーブルから別のパーティション テーブルにパーティションを移動する場合は、新しいパーティションを受け入れるパーティションが存在し、空になっている必要があります。

  • **転送先の非パーティション テーブルが存在し、空になっていること。**パーティションを再割り当てして 1 つの非パーティション テーブルを形成する場合、新しいパーティションを受け入れるテーブルが存在し、それが空の非パーティション テーブルになっている必要があります。

  • **パーティションが同じ列に設定されていること。**2 つのパーティション テーブル間でパーティションを切り替える場合は、両方のテーブルが同じ列でパーティション分割されている必要があります。

  • **ソース テーブルとターゲット テーブルが同じファイル グループを共有していること。**ALTER TABLE...SWITCH ステートメントのソース テーブルとターゲット テーブルは、同じファイル グループ内にあり、どちらの大きな値の列も同じファイル グループに格納されている必要があります。また、対応するインデックス、インデックス パーティション、またはインデックス付きビューのパーティションも、同じファイル グループに含まれている必要があります。ただし、対応するテーブルのインデックス パーティションや他の対応するインデックスについては、ファイル グループが同じでなくてもかまいません。

インデックス付きビューが定義されているパーティションの切り替えについては、「インデックス付きビューが定義されている場合のパーティション切り替え」を参照してください。

テーブルとインデックスの構造の要件

前述の一般的な要件に加えて、ソース テーブルとターゲット テーブルの構造は同じである必要があります。構造の要件は次のとおりです。

  • ソース テーブルとターゲット テーブルの列構造が同じで、同じ順序であること。テーブルの列の名前、データ型、データ長、照合順序、有効桁数、小数点以下桁数、NULL 値の許容、および PRIMARY KEY 制約 (指定されている場合) が同じで、ANSI_NULLS と QUOTED IDENTIFIER の設定も同じである必要があります。また、列が同じ順序で定義されている必要があります。ただし、IDENTITY プロパティは同じでなくてもかまいません。

    注記注意

    パーティションの切り替えを行うと、ターゲット テーブルの IDENTITY 列で値の重複が発生し、ソース テーブルの IDENTITY 列の値と一致しなくなる可能性があります。DBCC CHECKIDENT を使用してテーブルの ID 値を確認し、必要であれば値を修正してください。

  • パーティション分割列の NULL 値の許容状態が一致していることソース テーブルとターゲット テーブルは NULL または NOT NULL のどちらかである必要があります。一方のテーブルがパーティション分割されていない場合、パーティション分割されているもう一方のテーブルのパーティション列と、それに対応する非パーティション テーブルの列は、NULL の許容状態が一致している必要があります。

    重要な注意事項重要

    パーティション分割テーブルのパーティション分割列には NOT NULL を指定することをお勧めします。また、ALTER TABLE...SWITCH 操作のソースまたはターゲットとなっているパーティション分割されていないテーブルには、NOT NULL を指定することをお勧めします。パーティション分割列が NOT NULL の場合、パーティション分割列の CHECK 制約は、NULL 値のチェックを行うように強制されません。NULL 値は通常、パーティション分割テーブルの左端のパーティションに置かれます。ソース テーブルとターゲット テーブルに NOT NULL 制約がないと、左端以外のパーティションを切り替えるときに、ANSI_NULLS データベース オプションが ON に設定されており、CHECK 制約がパーティション分割列にも定義されている場合に、問題が起こる可能性があります。

  • 計算列の構文が同じであること。対応するパーティション キーが計算列の場合は、これらの計算列を定義する式の構文を同じにし、これらの計算列を保存する必要があります。

  • **ROWGUID プロパティが同じであること。**ROWGUID プロパティが定義されている列は、もう一方のテーブルでも ROWGUID プロパティが定義されている列に対応している必要があります。

  • **XML 列のスキーマが同じであること。**すべての xml 列は、同じ XML スキーマ コレクションに型指定されている必要があります。

  • **text 型、ntext 型、または image 型の列の行内設定が同じであること。**この設定の詳細については、「行内データ」を参照してください。

  • テーブルに同じクラスタ化インデックスが含まれていること。ソース テーブルとターゲット テーブルの両方に、同じクラスタ化インデックスが含まれている必要があり、パーティションを切り替える前にインデックスを無効にすることはできません。

  • **非クラスタ化インデックスが定義されており、それらが一意であること。**ターゲット テーブルに非クラスタ化インデックスが定義されている場合は、ソース テーブルにも同じものが定義されている必要があります。また、各インデックス キー列の一意性、サブキー、並べ替え方向 (ASC または DESC) の構造も一致している必要があります。無効化されている非クラスタ化インデックスについては、この要件は該当しません。

制約の要件

パーティションを移動するには、次の追加制約要件も満たす必要があります。

  • **CHECK 制約が正確に一致するか、ソースとターゲットの両方に適用できること。**ターゲット テーブルに CHECK 制約が定義されている場合は、まったく同じ制約であるか、ターゲット テーブルの CHECK 制約に (たとえばサブセットとして) 適用可能な制約をソース テーブルにも定義する必要があります。

  • **int 列の制約が同じであるか、またはサブセットであること。**ソース テーブルの int 列に対する CHECK 制約は、ターゲット テーブルの int 列に対する制約に一致するか、そのサブセットとして存在する必要があります。たとえば、ターゲット テーブルに int 列の Column1 があり、Column1 < 100 という制約が設定されていた場合、ソース テーブルの対応する Column1 列にも同じ制約を設定するか、その制約のサブセット (たとえば、Column1 < 90) をターゲット テーブルの値に設定する必要があります。複数の列を指定する CHECK 制約は、同じ構文を使用して定義する必要があります。

  • **パーティション分割されていないテーブルには、対象パーティションと同じ制約が必要。**非パーティション テーブルを既存のパーティション テーブルのパーティションとして追加する場合は、ターゲット テーブルのパーティション キーに対応するソース テーブルの列に、制約が定義されている必要があります。これにより、値の範囲がターゲット パーティションの境界値内に収まるようになります。

  • **基になるパーティションの境界値は、対象パーティションの境界内にあること。**2 つのパーティション テーブル間でパーティションを切り替える場合は、ソース パーティションの境界値が、ターゲット パーティションの境界値内に含まれている必要があります。境界値が収まりきらない場合は、ソース テーブルのパーティション キーに制約を定義し、ソース テーブル内のすべてのデータがターゲット パーティションの境界値内に収まるようにします。

    注記注意

    制約の定義ではデータ型を変換しないようにしてください。暗黙的または明示的なデータ型変換が指定された制約が、パーティションの切り替えのソース テーブルに定義されている場合、ALTER TABLE...SWITCH が失敗する可能性があります。

  • **ソース テーブルとターゲット テーブルに同じ FOREIGN KEY 制約が設定されていること。**ターゲット テーブルに FOREIGN KEY 制約がある場合、ソース テーブルの対応する列にも同じ外部キーを定義する必要があります。また、これらの外部キーは、ターゲット テーブルの主キーと同じ主キーを参照している必要があります。ソース テーブルの外部キーは、ターゲット テーブルの対応する外部キーにも is_not_trusted が設定されていない限り、is_not_trusted (sys.foreign_keys カタログ ビューで参照可能) を設定できません。この設定の詳細については、「インデックスを無効にする場合のガイドライン」を参照してください。SQL Server は、ターゲット テーブルの外部キーに CASCADE ルールが定義されている場合、それらを新たに移動されたパーティションに適用します。

パーティションの移動に関する追加要件

パーティションを移動するには、次の追加要件も満たす必要があります。

  • **インデックスがテーブルのパーティションに対応していること。**ソース テーブルのインデックスは、ソース テーブルに固定されている必要があります。ターゲット テーブルのインデックスは、ターゲット テーブルに固定されている必要があります。ソース テーブルとターゲット テーブルはどちらもパーティション分割できます。あるいは、パーティション分割されていない両方のテーブルまたは片方のテーブルのみをパーティション分割することもできます。インデックス配置の詳細については、「パーティション インデックスの専用ガイドライン」を参照してください。

  • **追加の制約および要件は、インデックス付きビューを持つソース テーブルに適用されます。**ALTER TABLE ... SWITCH ステートメント内のターゲット テーブルにインデックス付きビューが定義されている場合は、「インデックス付きビューが定義されている場合のパーティション切り替え」の制約と例を参照してください。

  • **フルテキスト インデックスは許可されない。**ソース テーブルにもターゲット テーブルにもフルテキスト インデックスは設定できません。

  • **XML インデックスはターゲット テーブルでは許可されない。**ターゲット テーブルには XML インデックスを設定できません。

  • **ソース テーブルに主キーが含まれている場合、主キーまたは外部キーは定義されない。**ソース テーブルが主キーを保持するアクティブな主キー/外部キー関係をソース テーブルとターゲット テーブル間に設定することはできません。

  • **ターゲット テーブルに外部キーが含まれている場合、主キーおよび外部キーは定義されない。**ターゲット テーブルが外部キーを保持するアクティブな主キー/外部キー関係を、ソース テーブルとターゲット テーブル間に設定することはできません。

  • **別のテーブルの外部キーがソース テーブルを参照することはできない。**ソース テーブルは、別のテーブルの外部キーから参照できません。

  • **ソース テーブルまたはターゲット テーブルのルールは許可されない。**ソース テーブルにもターゲット テーブルにもルールは定義できません。CHECK 制約はソース テーブルとターゲット テーブルに使用できます。

    注意注意

    ルールは旧バージョンとの互換性を保つための機能です。CHECK 制約を実装することをお勧めします。CHECK 制約の制限事項については、このトピックの「制約の要件」を参照してください。

  • **ソース テーブルとターゲット テーブルはレプリケートできない。**ソース テーブルもターゲット テーブルも、レプリケーションのソースにはできません。

  • **パーティションを切り替えるには、そのためのデータベース権限が必要。**パーティションの切り替えには ALTER TABLE ステートメントが使用されるので、必要なデータベース権限が ALTER TABLE ステートメントに関連付けられている必要があります。この権限のセットは、ソース テーブルとターゲット テーブルで同じである必要はありません。

  • **パーティションの移動中にはトリガをアクティブできない。**INSERT、UPDATE、DELETE の各トリガまたは連鎖操作は、テーブル パーティションの移動によりアクティブにはなりません。また、パーティションを移動するために、ソース テーブルとターゲット テーブルが同じように定義されたトリガを保持する必要はありません。

    注意注意

    ALTER TABLE...SWITCH 操作の実行中、スキーマ変更ロックがソース テーブルとターゲット テーブルの両方で取得され、変更中に他の接続を参照できないようにします。ロックの詳細については、「ロック モード」を参照してください。

テーブル パーティションを移動するには