4

単純なビューがあるとしMyViewます。

私が行った場合:

SELECT * FROM MyView

MyViewビューを構築するために、背後にある基になるクエリが実行されることを理解しています。

さて、もし私がそうするなら:

SELECT * FROM MyView WHERE MyValue BETWEEN 2 AND 5

が適用される前に、基になるクエリ全体を実行する必要があると考えるのは正しいWHEREですか?

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

(ビューを構成する and の条件と結合の条件に応じて、物事がより複雑になるWHEREと、ビューを使用せずにクエリを作成する方が効率的でしょうか?)

4

1 に答える 1

7

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

たとえば、このビュー:

create view that_view as select * from Orders

テーブルのスキャンで実行され、Ordersすべてのレコードが返されますが、

select * from that_view where order_number = 1

インデックス シークをオンにして実行されorder_number(インデックスがある場合)、テーブル全体を構築せずに 1 行のみを返します。

ただし、いくつかの落とし穴が存在します

于 2012-04-10T10:20:01.883 に答える