web-dev-qa-db-ja.com

SQL Serverでマテリアライズドビューを作成する方法

DWを設計し、具体化されたビューについて聞いた。実際にビューを作成したいのですが、ベーステーブルが変更されると自動的に更新されるはずです。誰でもクエリの例で説明できます。

84
Deepak

これらは、SQL Serverでインデックス付きビューと呼ばれています。詳細については、次のホワイトペーパーを参照してください。

基本的に、あなたがする必要があるのは:

  • 通常のビューを作成する
  • そのビューにクラスター化インデックスを作成します

これで完了です!

トリッキーな部分は、ビューが非常に多くの制約と制限を満たさなければならないことです-それらは白書で概説されています。これを行う場合-それがすべてです。ビューは自動的に更新されるため、メンテナンスは不要です。

追加のリソース:

124
marc_s

純粋にエンジニアリングの観点からですが、インデックス付きビューは誰もがパフォーマンスを改善するために使用できるもののように聞こえますが、実際のシナリオは非常に異なります。インデックスを作成できるものとできないものに対する制限が多すぎるため、インデックス付きビューを最も必要とする場所で使用することに失敗しました。

ビューに外部結合がある場合、それらは使用できません。また、一般的なテーブル式は許可されません...実際、サブセレクトまたは派生テーブルで順序付けがある場合(partition by句など)、運が悪いこともあります。

インデックス付きビューを利用するのは非常に単純なシナリオのみであり、とにかく基礎となるテーブルに適切なインデックスを作成することで最適化できると思います。

インデックス化されたビューを実際に使用して利益を得ることができ、それらなしではできなかった現実のシナリオを聞いて興奮します

37
Rajiv

マテリアライズドビューが実際に何であるかについて、もう少し背景が必要になる場合があります。 Oracleでは、これらは他の場所でビルドしようとすると、いくつかの要素で構成されるオブジェクトです。

MVIEWは、本質的に別のソースからのデータのスナップショットです。ビューとは異なり、ビューをクエリしてもデータは見つかりません。テーブルの形式でローカルに保存されます。 MVIEWは、定期的な間隔で、またはソースデータが変更されたときに開始されるバックグラウンドプロシージャを使用して更新されます。 Oracleでは、完全または部分的な更新が可能です。

SQL Serverでは、次を使用して基本的なMVIEWを作成し、定期的に(完全に)更新します。

まず、ビュー。ビューはどのデータベースでも非常に一般的であるため、ほとんどの場合、これは簡単です。次にテーブル。これは、列およびデータのビューと同一である必要があります。これにより、ビューデータのスナップショットが保存されます。次に、テーブルを切り捨て、ビュー内の現在のデータに基づいてテーブルをリロードするプロシージャ。最後に、作業を開始する手順をトリガーするジョブ。

それ以外はすべて実験です。

18
Jason A.

インデックス付きビューがオプションではなく、迅速な更新が不要な場合、ハックキャッシュテーブルを作成できます。

select * into cachetablename from myviewname
alter table cachetablename add primary key (columns)
-- OR alter table cachetablename add rid bigint identity primary key
create index...

次に、sp_rename view/tableを参照するか、それを参照するクエリまたは他のビューを変更してキャッシュテーブルを指すようにします。

毎日/毎晩/毎週/更新しないようにスケジュールする

begin transaction
truncate table cachetablename
insert into cachetablename select * from viewname
commit transaction

注:これは、txログにもスペースを消費します。計算が遅い小さなデータセットに最適です。 「簡単だが大きい」列を最初に外部ビューに削除するためにリファクタリングすることもできます。

3
stox

MS T-SQL Serverの場合、「include」ステートメントを使用してインデックスを作成することをお勧めします。一意性は必須ではなく、クラスター化インデックスに関連付けられたデータの物理的な並べ替えも必要ありません。 「Index ... Include()」は、システムによって自動的に維持される個別の物理データストレージを作成します。概念的にはOracleマテリアライズドビューに非常に似ています。

https://msdn.Microsoft.com/en-us/library/ms190806.aspx

https://technet.Microsoft.com/en-us/library/ms189607(v = sql.105).aspx

1