2011-02-05 11 views
3

ストアドプロシージャの生テーブルの代わりにビューを照会するのは良い方法ですか? (ビューが他のデータを提供していなくても)ストアドプロシージャのテーブルの代わりにビューを使用していますか?

抽象化の余分なレイヤーと、それがクラス関数のメンバー変数の代わりにプロパティーを使うのと似ているので、私はいつも考えていると思いました。

今はASP.NETメンバーシッププロバイダによって作成されたストアドプロシージャを見ていて、テーブルに対して直接クエリを実行していました。

ビューを使用するとデータを簡単に挿入することはできませんが、ストアドプロシージャがデータのみを照会する場合は、テーブルを直接使用する必要がありますか?はいの場合、主な理由は何ですか? (パフォーマンス?)

答えて

6

ビューは外部クエリに展開される単なるマクロです。

ビューに複数の結合が含まれている場合、他のビューに参加すると、ストアドプロシージャのSQLで実際に3つのJOINが表示されたときに突然20または30のJOINが発生します。それぞれのクエリが異なることもわかります。すべてのクエリで同じ20または30のテーブルを結合し続けるのはなぜですか?

一般に、ビューが索引付け/マテリアライズされ、オプティマイザがそれを使用できる場合を除き、メリットはありません。

ビューでマスクされた1つのテーブルの計算を行うなどのアイデアは、計算列に入れる必要があります。ビュー内の複数の表の計算には、索引付けする必要があります。

ストアドプロシージャを使用すると、すでにベーステーブルへのアクセス(所有者チェイン)が行われていないことを意味しています。ユーザーによる直接テーブルへのアクセスを回避するために、またはスキーマの変更をマスクする、またはいくつかの基本的なセキュリティを提供するために、ビューの良い使い方があります

(例えばSUSER_SNAMEに基づいて)ではなく、SQL Serverでのパフォーマンスやidealogy

3

さまざまなデータベースオプティマイザは、さまざまな方法でクエリを最適化するため、簡単な答えではありません。しかし、一般的に抽象レイヤーを追加する(間違いなく)オプティマイザがインデックスを正しく使用しないようにすることができます。 SQL Serverでは

あなたのような呼び出しを含むwhere句がある場合:

  • がNULL ISを
  • LIKE '%の何か'
  • ではない、それはnon-sargableそれを作る

をEXISTSクエリ、すなわちインデックスを使用しないクエリ、またはそれらを最適以下に使用します。

私はビューを使用するとsargにも影響すると思います。私は行ってこれを(SQL Serverで)テストします - 私は5分後に戻ります。私は答えが「それが依存」であり、あなたは確かにあなたのクエリ実行プラン、私は簡単な照会との間に差を示さなかった次のテストをオンにする必要があることを推測

EDIT

テーブルに基づいてビューを作成し、基礎となるテーブルにクエリを実行するだけです。複雑なビューが異なるように動作するため、さらにテストする必要があります。

Sql Execution Plan for accessing a simple view compared to the table directly

+0

"私は行こうと思っています(SQL Serverで) - 私は5分後に戻ってきます。"ええ、すごく感謝。私はここで待つだろう。 :D – magnattic

+0

それはわずか4分だった! – amelvin

0

Iは、これら2つの場合にストアドプロシージャのビューを使用した:

1 - 複合体について結合または複数のプロシージャ

2で必要とされる条件 - 改名テーブルのsubstitueします。たとえば、私は 'member'と 'non_member'という2つのテーブルを持っていました。私は後にこれらを「ユーザー」表に結合することに決めました。今までに書いたすべてのprocを変更するのを避けるため、 'member'と 'non_member'というビューを作成しました。このビューでは、where句を使用して 'user'テーブルを適切にフィルタリングしていました。すべてのプロクセスは、変更なしで慣れていたので動いていました。私は時間があるときに私はそれらを直接新しいテーブルにアクセスするように変更することができます。

0

(用少なくとも私の理解では、ストアドプロシージャはコンパイル時に最適化されるため、ビューよりも一般的に効率的です。私は確信はしていませんが、ビューに対してSPRCを実行すると、このようにして得られた最適化が失われる可能性があります。

さらに、なぜですか?これまでのポスターのように、1つ以上のビューが多数の結合で構成されている場合は、必要以上に多くの結合を実行している可能性がありますが、これは明白ではありません。

また、ビューを使用する主な理由の1つは、不注意な変更からテーブルデータを保護しながら、ユーザーが使用できる形式で表データを表示することです。 SPROCからの結果セットはINSERTとUPDATESの対象ではないので、この点は疑問です。

デザインでストアドプロシージャがパラメータを受け取り、ユーザーがテーブルデータと直接対話することを許可しないため、ビューで使用するクエリロジックを実行することができます。 (いくつかの例外を除いて)これが主な理由は、パフォーマンスと保守性の潜在的なコストでCODINGを簡単にすることです(SPROCがそれに依存していることを理解することなく、

特にそうではない魅力的な理由がない限り、すべてをSPROCにコーディングすることをおすすめします。 。 。

関連する問題