SELECT FROM的内部视图WHERE

时间:2012-04-10 10:17:25

标签: sql sql-server tsql

假设我有一个简单的视图,MyView

如果我这样做:

SELECT * FROM MyView

我理解执行MyView背后的基础查询来构建视图。

现在,如果我要:

SELECT * FROM MyView WHERE MyValue BETWEEN 2 AND 5

我是否认为在应用WHERE之前仍必须执行整个基础查询?

我相信这是从执行计划窗口看到的情况,但我认为我的例子可能太简单了,看不到任何真正的区别。

(意味着随着事情变得越来越复杂,取决于WHERE的条件以及构成视图的连接中的条件,在不使用视图的情况下编写查询会更有效率?)

1 个答案:

答案 0 :(得分:5)

没有。外部应用于视图的where子句被“插入”到视图中,就好像它是它的组成部分一样。是否会导致所获取视图的所有记录取决于您要查询的列的性质,但结果基本上与您执行由视图正文和{{1}组成的特殊查询相同条款。

例如,这个观点:

where

将在create view that_view as select * from Orders 表上扫描执行,返回所有记录,而

Orders

将在select * from that_view where order_number = 1 上执行索引搜索(假设您有索引),只返回一行而不构建整个表。

Some gotchas exist though