2012-04-10 20 views
2

シンプルなビュー、MyViewと言っています。SELECT FROMビューの内部WHERE

私が行う場合:

SELECT * FROM MyView 

私はMyViewの背後にある根本的なクエリがビューを構築するために実行されることを理解しています。私がいた場合

は今、:

SELECT * FROM MyView WHERE MyValue BETWEEN 2 AND 5 

私は右WHEREが適用される前に、全体の基盤となるクエリがまだ実行されなければならないと考えているだろうか?

実行計画ウィンドウを見ると、これが当てはまると思いますが、私の例はあまりにも単純で実際の違いは見えないかもしれません。

(含意されているものはそれは、ビューを構成することがビューを使用せずにクエリを記述する方が効率的でしょう合流にWHEREとの条件や状況に応じて、より複雑な取得と?)

+0

'MyValue'は、計算された式またはベーステーブルの列ですか? –

+0

私は基本表の列を推測します。ただ一般的な言葉で話してください。重要な違いはありますか? – Gavin

答えて

5

No.A whereビューに外部的に適用されている句は、ビューの不可欠な部分であるかのようにビューに「挿入」されます。取得されたビューのすべてのレコードが取得するかどうかは、照会する列の性質によって異なりますが、結果は基本的にビュー本体とwhere句からなるアドホッククエリを実行していた場合と同じになります。提供

select * from that_view where order_number = 1 

インデックスで実行されるのに対し、

create view that_view as select * from Orders 

は、すべてのレコードを返す、Ordersテーブルのスキャンで実行される(order_numberにシーク:

例えば、このビューはあなたはインデックスを持っています)、テーブル全体を構築せずに1つの行だけを返します。

Some gotchas exist though

+1

@ Gavinあなたの列が例えば集計関数の場合、集計を計算するために 'that_column = x'がすべての関連レコード(最良の場合)またはすべてのレコード(最悪の場合)をフェッチすると言ってください。サブクエリから来るカラムと同じです:(それが特定のウィンドウ関数のように)フェッチされたすべてのサブクエリレコードを引き起こすか、テーブルからまっすぐに来る "通常の"カラムと同じように動作します。しかし、私が言ったように、あなたは常に最良の結果を得るつもりです(SQL Serverのバグを脇に置いています)。ビューを避けてもパフォーマンスは向上しません。 – GSerg

関連する問題