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

テーブルまたはインデックスをパーティション分割することにより、Transact-SQL ALTER TABLE...SWITCH ステートメントを次に示す方法で使用して、データのサブセットを迅速かつ効率的に移動できます。

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

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

  • パーティションを削除し、1 つのテーブルを形成します。

これらのシナリオは、パーティション テーブルへの新しいデータの追加や、同一のパーティション テーブルからの古いデータの削除を定期的に行う場合に役立ちます。この操作では、多種多様なシナリオでさまざまな規模のデータを処理できます。追加する新しいデータの読み込み、スクラビング、変換が必要な場合、そのデータを個別のエンティティとして扱い、パーティションとして追加できます。古いデータはアーカイブまたはウェアハウスとして保存できます。INSERT INTO SELECT FROM ステートメントと異なり、データは物理的に移動されないので、どのような規模のデータ集合も、迅速かつ効率的に転送されます。そのデータの格納場所に関するメタデータだけが、あるパーティションから別のパーティションを表すように変更されます。

サンプル シナリオ

AdventureWorks2008R2 サンプル データベースのパーティション分割シナリオでは、パーティションを 2 つのテーブル間で切り替えることにより、Adventure Works Cycles の TransactionHistory テーブルの古いデータを TransactionHistoryArchive テーブルに保管しています。これは、TransactionDate フィールドの TransactionHistory をパーティション分割することで行われています。パーティションごとの値の範囲は 1 か月です。TransactionHistoryArchive テーブルでは古いトランザクションが保持されますが、TransactionHistory テーブルではその年の最新のトランザクションが保持されます。このようにテーブルをパーティション分割することにより、1 か月分の古いデータを、1 か月ごとに TransactionHistory から TransactionHistoryArchive に転送できます。

各月の初めに、TransactionHistory テーブルにそのときに格納されている最も古い月のデータが TransactionHistoryArchive テーブルに転送されます。この作業を完了するために、次の処理が実行されます。

  1. TransactionHistoryArchive テーブルには TransactionHistory テーブルと同じ設計のスキーマを使用する必要があります。新しいデータを受信するための空のパーティションも必要です。この場合、TransactionHistoryArchive は 2 つだけのパーティションで構成されているパーティション テーブルです。一方のパーティションでは 2003 年 9 月より前のすべてのデータが保持され、もう一方のパーティションでは 2003 年 9 月以降のすべてのデータが保持されます。最後のパーティションは空です。

    パーティション分割切り替え前のテーブル構造

  2. TransactionHistoryArchive テーブルのパーティション関数により、このテーブルの空のパーティションが 2 つに分割され、そのうちの 1 つが 2003 年 9 月のデータ用の新しいパーティションを受け取るように定義されます。

    パーティション分割切り替えの手順 1

  3. 2003 年 9 月に作成されたすべてのデータを格納している TransactionHistory テーブルの最初のパーティションは、TransactionHistoryArchive テーブルの 2 つ目のパーティションに切り替えられます。9 月 1 日より前のデータを含まないように指定するために、TransactionHistory テーブルに CHECK 制約を定義する必要があります (TransactionDate >= '9/01/2003')。この制約を定義すると、パーティション 1 では 2003 年 9 月のデータだけを保持し、TransactionHistoryArchive テーブルの 2003 年 9 月のデータだけを保持するパーティションに切り替える準備が整います。また、各テーブルと対応していないインデックスは、切り替え前に削除するか無効にする必要があります。ただし、切り替え後にインデックスを再作成できます。パーティション インデックスの対応については、「パーティション インデックスの専用ガイドライン」を参照してください。

    パーティション分割切り替えの手順 2

  4. TransactionHistory テーブルのパーティション関数が変更され、最初の 2 つのパーティションから 1 つのパーティションへとマージされます。現在のパーティション 1 に 2003 年 10 月に作成されたすべてのデータが格納され、既存の CHECK 制約を変更して 10 月 1 日より前のデータを含まないように指定することで (TransactionDate >= '10/01/2003')、来月 TransactionHistoryArchive に切り替える準備が整います。

    パーティション分割切り替えの手順 3

  5. TransactionHistoryArchive テーブルのパーティション関数が再度変更されて、追加された 9 月のデータを格納する 2 つ目のパーティションと、1 つ目のパーティションがマージされます。この操作により、TransactionHistoryArchive テーブルは、1 つ目のパーティションにすべてのデータを保持し、2 つ目のパーティションが空という最初の条件に戻されます。

    パーティション分割切り替えの手順 4

  6. TransactionHistory テーブルのパーティション関数が再度変更されて、このテーブルの最後のパーティションが 2 つのパーティションに分割されるので、最新の月がその前の月から分割されて、新しいデータを受け取る準備が整います。

    パーティション分割切り替えの手順 5

このシナリオを実装する Transact-SQL スクリプトについては、ReadMe_SlidingWindow サンプルを参照してください。サンプルの詳細については、「SQL Server のサンプルとサンプル データベースのインストールに関する注意点」を参照してください。