パーティション ビューの使用

パーティション ビューにより、大きなテーブルのデータを小さなメンバ テーブルに分割できます。データは、いずれかの列のデータ値の範囲に基づいてメンバ テーブル間でパーティション分割されます。各メンバ テーブルのデータ範囲は、パーティション分割列に指定する CHECK 制約で定義されます。その後、すべてのメンバ テーブルの選択を結合して単一の結果セットにするために、UNION ALL を使用したビューを定義します。このビューを参照する SELECT ステートメントでパーティション列に対する検索条件が指定された場合、クエリ オプティマイザは CHECK 制約の定義を使用して、求める行がどのメンバ テーブルに入っているかを判断します。

注意注意

1 台のサーバーに対してローカルなデータをパーティション分割するには、パーティション テーブルを使用する方法をお勧めします。詳細については、「パーティション テーブルとパーティション インデックス」を参照してください。

たとえば、1998 年の売り上げを記録した販売テーブルを 1 か月につき 1 つとして、12 のメンバ テーブルにパーティション分割したとします。各メンバ テーブルでは、次のように OrderMonth 列で制約を定義します。

CREATE TABLE May1998sales
   (OrderID      INT,
   CustomerID      INT      NOT NULL,
   OrderDate      DATETIME      NULL
      CHECK (DATEPART(yy, OrderDate) = 1998),
   OrderMonth      INT
      CHECK (OrderMonth = 5),
   DeliveryDate      DATETIME      NULL
      CHECK(DATEPART(mm, DeliveryDate) = 5)
   CONSTRAINT OrderIDMonth PRIMARY KEY(OrderID, OrderMonth)
   )

May1998sales にデータを記録していくアプリケーションでは、すべての行の OrderMonth 列が 5 であり、受注日が 1998 年 5 月の日付であるようにする必要があります。このことは、テーブルに定義した制約によって強制されます。

UNION ALL を使用して、単一の結果セットとして 12 のメンバ テーブルすべてからデータを選択するビューを次のように定義します。

CREATE VIEW Year1998Sales
AS
SELECT * FROM Jan1998Sales
UNION ALL
SELECT * FROM Feb1998Sales
UNION ALL
SELECT * FROM Mar1998Sales
UNION ALL
SELECT * FROM Apr1998Sales
UNION ALL
SELECT * FROM May1998Sales
UNION ALL
SELECT * FROM Jun1998Sales
UNION ALL
SELECT * FROM Jul1998Sales
UNION ALL
SELECT * FROM Aug1998Sales
UNION ALL
SELECT * FROM Sep1998Sales
UNION ALL
SELECT * FROM Oct1998Sales
UNION ALL
SELECT * FROM Nov1998Sales
UNION ALL
SELECT * FROM Dec1998Sales

たとえば、次の SELECT ステートメントでは、特定の月についての情報を照会できます。

SELECT *
FROM Year1998Sales
WHERE OrderMonth IN (5,6) AND CustomerID = 64892

SQL Server のクエリ オプティマイザは、この SELECT ステートメントの検索条件では、May1998Sales テーブルと Jun1998Sales テーブルの行しか参照されていないことを認識します。そのため、この 2 つのテーブルだけが検索対象になります。

パーティション ビューを更新するには、パーティション分割列が、ベース テーブルの主キーの一部である必要があります。ビューが更新可能ではない場合は、更新が可能なビューに INSTEAD OF トリガを作成できます。このトリガにはエラー処理を実装し、重複する行が挿入されないようにします。ビュー用にデザインされた INSTEAD OF トリガの例については、「INSTEAD OF トリガのデザイン」を参照してください。

CHECK 制約を指定しないとパーティション ビューが正しい結果を返さないわけではありません。ただし、CHECK 制約を定義しないと、クエリ オプティマイザではパーティション分割列に対する検索条件の対象となるテーブルだけでなく、すべてのテーブルを検索する必要があります。CHECK 制約がなければ、このビューは UNION ALL を使用する他のビューとまったく同じ動作をします。クエリ オプティマイザでは、さまざまなテーブルに格納されている値についてどのような想定も行うことができず、ビュー定義に参加しているテーブルの検索をスキップできません。

パーティション ビューで参照されるメンバ テーブルがすべて同一のサーバーにある場合、このビューはローカル パーティション ビューになります。メンバ テーブルが複数のサーバーに存在する場合、このビューは分散パーティション ビューになります。分散パーティション ビューを使用すれば、システムがデータベースを処理するときの負荷を各サーバーに分散することができます。詳細については、「連合データベース サーバー」を参照してください。

パーティション ビューによって、メンバ テーブルを個別に管理するのが容易になります。たとえば、期末に次の操作を実行できます。

  • 現在の結果に関するパーティション ビューの定義を、最新の期間を追加し、最古の期間を削除するように変更できます。

  • 過去の結果に関するパーティション ビューの定義を、現在の結果のビューから削除されたばかりの期間を追加するように変更できます。また、過去の結果のビューは、その対象となる最古の期間を除去して保存するように更新することもできます。

パーティション ビューにデータを追加する際には、システム ストアド プロシージャ sp_executesql を使用すると、同時接続ユーザーの多いシステムで再利用される可能性の高い実行プランを備えた INSERT ステートメントを作成することができます。

注意注意

パーティション ビューへのデータの一括インポートは、bcp コマンド、BULK INSERT ステートメント、INSERT ... SELECT * FROM OPENROWSET(BULK...) ステートメントのいずれでもサポートされません。ただし、INSERT ステートメントを使用することにより、パーティション ビューに複数の行を挿入できます。