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

更新 : 2006 年 12 月 12 日

Transact-SQL ALTER TABLE...SWITCH ステートメントを使用すると、次の方法により、データ ブロックをすばやく効率的に転送できます。

  • テーブルを既存のパーティション テーブルのパーティションとして割り当てます。
  • パーティション テーブル間でパーティションを切り替えます。
  • パーティションを再割り当てし、1 つのテーブルを形成します。

パーティションの切り替えの概念については、「データのサブセットを管理するためのパーティションの設計」を参照してください。パーティションの切り替えを実装するサンプル コードを参照するには、「Readme_SlidingWindow」を参照してください。

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

パーティションを転送するときに、データの物理的な移動は行われません。データの格納場所についてのメタデータが変更されるだけです。したがって、パーティションの転送元 (ソース テーブル) と転送先のテーブル (ターゲット テーブル) の両方が、SWITCH 操作を実行する前に、データベースに作成されている必要があります。

テーブルをパーティションとして既存のパーティション テーブルに追加する場合、またはあるパーティション テーブルから別のパーティション テーブルにパーティションを移動する場合は、転送先のパーティションが存在し、空である必要があります。

パーティションを再割り当てして 1 つのパーティション分割されていないテーブルを形成する場合、パーティション転送先のテーブルが存在し、空である必要があります。

2 つのパーティション テーブル間でパーティションを切り替える場合は、どちらのテーブルも同じ列を基にしてパーティション分割されている必要があります。

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

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

ソース テーブルとターゲット テーブルは同じ構造を備えている必要があります。これは、次のことを意味します。

  • 列、列の名前、データ型、データ長、照合順序、有効桁数、小数点以下桁数、NULL 値の許容、PRIMARY KEY 制約が同じで、ANSI_NULLS と QUOTED IDENTIFIER の設定も同じである必要があります。また、列が同じ順序で定義されている必要があります。ただし、IDENTITY プロパティは同じでなくてもかまいません。
    ms191160.Caution(ja-jp,SQL.90).gif注意 :
    パーティションの切り替えを行うと、ターゲット テーブルの IDENTITY 列で値の重複が発生し、ソース テーブルの IDENTITY 列の値と一致しなくなる可能性があります。DBCC CHECKIDENT を使用してテーブルの ID 値を確認し、必要であれば値を修正してください。
  • パーティション分割列の NULL 値の許容状態は一致している必要があります。つまり、どちらも NULL か NOT NULL のいずれかである必要があります。いずれかのテーブルがパーティション分割されていない場合、もう一方のテーブルのパーティション分割列に対応する列の NULL の許容状態は、そのパーティション分割列に合わせる必要があります。
    ms191160.note(ja-jp,SQL.90).gif重要 :
    パーティション テーブルのパーティション分割列に加え、ALTER TABLE...SWITCH 操作のソースまたはターゲットとなっているパーティション分割されていないテーブルの列にも、NOT NULL を指定することをお勧めします。こうすると、パーティション分割列の CHECK 制約で NULL 値のチェックを行う必要がなくなります。NULL 値は通常、パーティション テーブルの左端のパーティションに置かれます。左端以外のパーティションを切り替える場合で、ANSI_NULLS データベース オプションが ON に設定されている場合、ソース テーブルとターゲット テーブルに NOT NULL 制約がないと、CHECK 制約がパーティション分割列にも定義されているときに問題が起こる可能性があります。
  • 対応するパーティション キーが計算列の場合は、これらの計算列を定義する式の構文を同じにし、これらの計算列を保存する必要があります。
  • ROWGUID プロパティが定義されている列は、もう一方のテーブルでも ROWGUID プロパティが定義されている列に対応させる必要があります。
  • すべての xml 列は、同じ XML スキーマ コレクションに型指定されている必要があります。
  • textntext、またはimage 列の行内設定は、同じである必要があります。この設定の詳細については、「行内データ」を参照してください。
  • どちらのテーブルにも、同じクラスタ化インデックスが含まれている必要があります。このインデックスは無効にできません。
  • ターゲット テーブルに非クラスタ化インデックスが定義されている場合は、ソース テーブルにも同じものが定義されている必要があります。また、各インデックス キー列の一意性、サブキー、並べ替え方向 (ASC または DESC) の構造も一致している必要があります。無効化されている非クラスタ化インデックスについては、この要件は該当しません。

制約の要件

ターゲット テーブルに CHECK 制約が定義されている場合は、まったく同じ制約か、ターゲット テーブルの CHECK 制約に適用可能な CHECK 制約をソース テーブルにも定義する必要があります。

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

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

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

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

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

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

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

  • ソース テーブルまたはターゲット テーブルのインデックスは、ソース テーブルまたはターゲット テーブルの一方または両方がパーティション分割されているかどうかにかかわらず、それぞれのテーブルに対応している必要があります。
  • ソース テーブルにもターゲット テーブルにもフルテキスト インデックスは設定できません。
  • ターゲット テーブルには XML インデックスを設定できません。
  • ソース テーブルが主キーを保持するアクティブな主キー/外部キー関係をソース テーブルとターゲット テーブル間に設定することはできません。
  • ターゲット テーブルが外部キーを保持するアクティブな主キー/外部キー関係を、ソース テーブルとターゲット テーブル間に設定することはできません。
  • ソース テーブルは、別のテーブルの外部キーから参照することはできません。
  • ソース テーブルとターゲット テーブルは、スキーマ バインドのあるビューには参加できません。したがって、これらのテーブルにはインデックス ビューを定義できません。
  • ソース テーブルにもターゲット テーブルにもルールは定義できません。
    ms191160.note(ja-jp,SQL.90).gifメモ :
    ルールは旧バージョンとの互換性を保つための機能です。CHECK 制約を実装することをお勧めします。CHECK 制約の制限事項については、このトピックの「制約の要件」を参照してください。
  • ソース テーブルもターゲット テーブルも、レプリケーションのソースにはできません。
  • パーティションの切り替えには、ALTER TABLE ステートメントを実行する必要があります。したがって、ALTER TABLE ステートメントに関連するデータベース権限が必要です。この権限のセットは、ソース テーブルとターゲット テーブルで同じである必要はありません。

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

ms191160.note(ja-jp,SQL.90).gifメモ :
ALTER TABLE...SWITCH 操作を実行することで、スキーマ変更ロックがソース テーブルとターゲット テーブルの両方で取得され、テーブルのメタデータであっても変更中に他の接続が参照できないようにします。ロックの詳細については、「ロック モード」を参照してください。

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

参照

概念

データのサブセットを管理するためのパーティションの設計

その他の技術情報

DBCC CHECKIDENT (Transact-SQL)
ALTER PARTITION FUNCTION (Transact-SQL)
ALTER PARTITION SCHEME (Transact-SQL)
Readme_SlidingWindow

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 12 月 12 日

追加内容 :

パーティション テーブルのパーティション分割列に加え、ALTER TABLE...SWITCH 操作のソースまたはターゲットとなっているパーティション分割されていないテーブルの列にも、NOT NULL を指定することを推奨する注記を追加しました。

2006 年 4 月 14 日

変更内容 :
  • ソース テーブルに XML インデックスを定義してもパーティションの切り替えに影響はありませんが、パーティションを切り替えるためにターゲット テーブルに XML インデックスを設定することはできません。