2011-05-06 10 views
13

入れ子になったビューを使用するかどうかについての一般的なベストプラクティスはありますか?ネストされたビューを使用するとパフォーマンスが低下しますか?あなたが4つ以上の層を深く掘り下げるまで、実際にパフォーマンスが低下しないというベストプラクティスはありますか?Sql Server 2008入れ子のビュー

私がこれを求めている理由は、それらを使用するかどうかに苦しんでいるからです。私がその情報へのアクセスを得るための唯一の方法が20以上のテーブルを一緒に参加させることによって報告要求を得るのは珍しいことではありません。フィールドはすべてのテーブルから返されませんが、正しいデータを選択するために必要です。この場合、ビューのネストと他のレポートの下位レベルのビューの再利用が好きです。なぜなら、ロジックへの変更が必要な場合は、ただ1つのビューを更新するだけで、すべてのレポートが更新されるからです。私が扱っているテーブルの多くは、何百万と何百万というレコードを含んでいます。

しかしこれは良い方法ではないかもしれません。あなたはこれについてあなたの考えを共有してもよろしいですか?

+2

ビューは集計を行いますか?同じ基本表をそれ自身に結合していますか?実行計画を見て、最適な計画が得られていないかどうかを確認してください。 –

+0

「ネストされたビュー」の例を教えてください。インライン・ビュー(AKA派生テーブル)、マテリアライズド・ビュー(SQL ServerのAKA索引ビュー)などの用語に慣れています。 –

+1

@OMG - 他のビューを参照する他のビューを参照するビューを意味します。 –

答えて

11

これはどうしても避けています。最初にビューを入れ子にしたら、インデックスに登録することはできません。次に、次のレイヤーに到達するために、基になるビューを完全にマテリアライズする必要があるためです。したがって、5つのレコードの最終結果を得るために、数百万のレコードを実現することができます。開発者が1つのデータベース(設計に入力したデータベースではありません)でこれを実行した場合、パフォーマンスは非常に悪かったため、数百万ドルのクライアントをほとんど失ってしまいました。

最後に、これらの種類のレイヤーは、変更が必要なときに維持するのがはるかに難しいことがわかりました。 12層のビューを追跡して修正する必要があるものを見つけることは楽しいことではありません。 devsは下層のレイヤーを修正するよりも別のレイヤーを追加するほうが簡単で、1つのクエリであまりにも多くのテーブルにアクセスしようとしていたため、アクセスされている同じ数百万のレコードテーブルビューの異なるレイヤーで7または8回。

私が管理しているデータベースのビューに複数のレイヤーを許可する状況はありません。それを行うと怒ってしまいます。

+2

+1 SQLは、ビューのネストを避けるために自分自身を繰り返すことが適切な状況です。 – Matthew

+6

オプティマイザは、ビューのロジックが複雑でインデックスを不明瞭にしない限り、ネストされたビューでインデックスを使用できます。索引ビューは異なる一連の問題を示しますが、単純なジョインを実行する通常のビューでは、ネストはオプティマイザーが索引を使用するのを妨げません。 –

+0

私はあなたが基礎となるインデックスを使用することができないということではなく、ビューにインデックスを作成することはできないということです。しかし、オプティマイザがこれを効率的に処理する方法を理解することができないところまで、すばやく到達することができます。だけでなく、彼らは非常に迅速にunmaintainable混乱になります。可能であれば避けてください、ほとんど常に可能なSQL反パターンです。 – HLGEM

4

その他のオプション: インデックス表示 - 正しく使用しないと危険ですが、パフォーマンスが向上する可能性があります。解析

- あなたが手続きを経て必要なデータが一時テーブルにそれを書き出す取得が一時テーブルから選択する - などのグループ化などが

手順&一時テーブルを設定します。

全体的に私は、ビューまたはネストされたビューのビューでのビューのパフォーマンスヒットが気に入らない。

一般に、後のすべての情報を含むテーブル間の正しい結合を使用して1つのビューを生成し、条件を使用してデータをフィルタすることができます。

+0

インデックス付きビューに関する質問。ビューを明示的に指定する必要があるか、または基本表に行く場合でもオプティマイザが索引付けされたビューを選択しますが、実行パスではビューの方が優れていると判断されます。 – user742085

+1

だから私はこの答えを見つけたビューは、クエリ実行プランでオプティマイザを使用するためにクエリで直接参照する必要はありません。 – user742085

+0

@user - バージョンを表します。これはエンタープライズ版とデベロッパ版でのみ発生します。そうでない場合は、ビューを明示的に参照し、 'noexpand'ヒントを使用する必要があります。 –