SELECT FROM的内部视图WHERE

Gav*_*vin 3 sql t-sql sql-server

说我有一个简单的观点,MyView.

如果我做:

SELECT * FROM MyView
Run Code Online (Sandbox Code Playgroud)

我知道后面的底层查询MyView是为了构建视图而执行的.

现在,如果我是:

SELECT * FROM MyView WHERE MyValue BETWEEN 2 AND 5
Run Code Online (Sandbox Code Playgroud)

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

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

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

GSe*_*erg 5

编号A where外部施加到视图子句"插入"到该视图,好像它是它的一个组成部分.无论这是否会导致视图的所有记录获取取决于您所查询的列的性质,但其结果将基本上是一样的,如果你执行即席查询由该视图机身加你的where条款.

例如,这个观点:

create view that_view as select * from Orders
Run Code Online (Sandbox Code Playgroud)

将在Orders表上扫描执行,返回所有记录,而

select * from that_view where order_number = 1
Run Code Online (Sandbox Code Playgroud)

将使用索引搜索执行order_number(如果您有索引),只返回一行而不构建整个表.

虽然存在一些问题.