假设我有一个简单的视图,MyView
。
如果我这样做:
SELECT * FROM MyView
我理解执行MyView
背后的基础查询来构建视图。
现在,如果我要:
SELECT * FROM MyView WHERE MyValue BETWEEN 2 AND 5
我是否认为在应用WHERE
之前仍必须执行整个基础查询?
我相信这是从执行计划窗口看到的情况,但我认为我的例子可能太简单了,看不到任何真正的区别。
(意味着随着事情变得越来越复杂,取决于WHERE
的条件以及构成视图的连接中的条件,在不使用视图的情况下编写查询会更有效率?)
答案 0 :(得分:5)
没有。外部应用于视图的where
子句被“插入”到视图中,就好像它是它的组成部分一样。是否会导致所获取视图的所有记录取决于您要查询的列的性质,但结果基本上与您执行由视图正文和{{1}组成的特殊查询相同条款。
例如,这个观点:
where
将在create view that_view as select * from Orders
表上扫描执行,返回所有记录,而
Orders
将在select * from that_view where order_number = 1
上执行索引搜索(假设您有索引),只返回一行而不构建整个表。