Sql “从视图中选择”的内部构件,其中

Sql “从视图中选择”的内部构件,其中,sql,sql-server,tsql,Sql,Sql Server,Tsql,假设我有一个简单的视图,MyView 如果我这样做: SELECT * FROM MyView 我知道执行MyView后面的底层查询是为了构建视图 现在,如果我要: SELECT * FROM MyView WHERE MyValue BETWEEN 2 AND 5 我认为在应用之前必须执行整个基础查询,对吗 从执行计划窗口来看,我相信情况就是这样,但我认为我的示例可能太简单,看不到任何真正的区别 (这意味着随着事情变得越来越复杂,取决于WHERE的条件和组成视图的连接中的条件,不使用视图编

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

如果我这样做:

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

现在,如果我要:

SELECT * FROM MyView WHERE MyValue BETWEEN 2 AND 5
我认为在应用
之前必须执行整个基础查询,对吗

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


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

否。外部应用于视图的
WHERE
子句被“插入”进入视野,仿佛它是其中的一部分。这是否会导致获取视图的所有记录取决于所查询列的性质,但结果基本上与执行由视图主体和
where
子句组成的临时查询相同

例如,此视图:

create view that_view as select * from Orders
将通过扫描
订单
表执行,返回所有记录,而

select * from that_view where order_number = 1
将在
订单号
上执行索引查找(如果您有索引),只返回一行而不构建整个表


.

MyValue
一个计算表达式还是基表中的一列?我猜是基表中的一列,只是泛泛而谈而已。会有显著的区别吗?@Gavin好吧,如果你的列是一个聚合函数,那么说
,其中该列=x
将导致获取所有相关记录(最佳情况)或所有记录(最坏情况),以计算聚合。对于来自子查询的列也是如此:它可能导致获取所有子查询记录(例如,如果它是某个窗口函数),或者它的性能可能与直接来自表的“普通”列一样。但是正如我所说的,您总是能够获得尽可能好的结果(将SQL Server bug放在一边)。避免查看不会获得任何性能。