2009-11-12 44 views

答えて

8

は、特定の行にテーブルを制限ビューがあるとしましょう:あなたはこのビューにインデックスを作成した場合

create view dbo.vw_HotProducts 
as 
select * from dbo.Products where Hot = 1 

は今、インデックスは、ホット製品が含まれています。ビューの結果を一時テーブルに格納することと比較することができます。これは、複数の結合を持つ複雑なクエリに非常に便利です。基本的に出力がキャッシュされます。

インデックス付きビューの大きな欠点は、基になるテーブルデータが変更されるたびにインデックスが再作成されることです。これにより、通常はデータウェアハウスやビジネスインテリジェンス環境で頻繁に変更されないデータに対してインデックス付きビューの使用が制限されます。

+0

は、我々は、ビューの(非キー)列に基づいてインデックスを作成することができますか? –

+0

@ Q8-coder:ビューのインデックスはクラスタ化され一意でなければなりません。したがって、ビュー結果の行を一意に特定する限り、非キー列を選択することができます。 – Andomar

+2

@Andomar:どのようなデータ変更でもインデックス付きビューが再作成されるわけではありません。 SQL Serverは、ベーステーブルの変更を反映するために、マテリアライズドビューを変更します。そのため、SQL Serverは、どのようなビューを実現できるかについて非常に多くの制限を設けています。つまり、集約が少ない、外部結合がない、結合がない、セルフ・ジョインがないなどの理由により、INSERT/DELETEではなくUPDATEによってのみデータが変更されます。しかし、私は、インデックス化されたビューが百万行のテーブルに加わるOLTPアプリケーションでうまく使用されているのを見ました。 YMMV – Tadmas

5

http://msdn.microsoft.com/en-us/library/aa258260(SQL.80).aspx

が ビューに独自のクラスタ化インデックスを作成するクエリのパフォーマンスを向上させ ビューが とテーブルがクラスタ化インデックスが格納されているのと同じ方法で データベースに格納されているので参照してください。

ビューは、適切なビューからテーブルに変換されます。ビュー定義は、このテーブルを更新するために使用されます。

Oracleは、これらの「マテリアライズド・ビュー」をコールします。

+2

インデックス付きビューは実際にはシステム管理テーブルなので、非クラスタ化インデックスを追加作成することもできます –

+0

両方:ビューにNCインデックスを作成できます。私はそれを行う.. – gbn

+0

あなたが作成する最初のインデックスのように一意であり、キャッシュテーブルを定義するためにクラスタ化する必要があります。 marc_sが言うように、追加インデックスは一意ではない可能性があります。 – Andomar

6

ビュー自体は現実的でも「持続的」でもなく、パフォーマンス上の利点もありません。これは単なるマクロですthat's expanded.

インデックスを追加すると、オプティマイザはインデックスを追加して物理的に存在する(永続的になります)ので、それを使用することを検討します。マクロではありません。

Oracleは、より良い名前である「マテリアライズド・ビュー」と呼んでいると確信しています。

AはFYI関連:計算列が同じことをやっPERSISTEDオプションを持っている...

+0

+1のために〜ありがとう –