第一问:使用视图查询时是否会先生成中间的临时表?
视图为
create view vw as select * from tbl
那么,我执行
select * from vw
时,是否等效于
select * from (select * from tbl) tmptbl
也就是先由基表按视图生成中间表,再从中间表查询?
第二问:使用视图查询因为条件顺序会否降低查询效率?
已知
select * from tbl where a='AAA' -- 结果多
select * from tbl where b='BBB' -- 结果少
那么
select * from tbl where a='AAA' and b='BBB' -- 效率低
select * from tbl where b='BBB' and a='AAA' -- 效率高
这个应该没错吧?
现在,因为 a 值已知,而 b 值未知,于是,我只能创建视图
create view vw as select * from tbl where a='已确定'
那么我执行
select * from vw where b='不确定'
时,它是不是就等效于
select * from tbl where a='已确定' and b='不确定'
呢?我该如何创建视图才能让它得出
select * from tbl where b='不确定' and a='已确定'
的效果呢?
------解决思路----------------------
第一问:使用视图查询时是否会先生成中间的临时表?
视图是一张虚表,本身不存储任何数据,是若干表字段的一个逻辑组合,但确实是数据库对象,而非临时表的概念,
第二问:使用视图查询因为条件顺序会否降低查询效率?
这个观点,我不赞同,查询时间的长短固然跟记录多少有关,但效率而言与条件的先后顺序没有多大关系吧,还请研究过的大神论证。
------解决思路----------------------
第二问:使用视图查询因为条件顺序会否降低查询效率?
不会,mssql 会自动优化
------解决思路----------------------
第一问:使用视图查询时是否会先生成中间的临时表?
--> 不会.
第二问:使用视图查询因为条件顺序会否降低查询效率?
--> 不一定.
视图可以等效为一个查询语句而已,
查询视图时,仅将视图名替换为对应查询语句的子查询.
------解决思路----------------------
统一回复吧,非索引视图的情况下,视图仅仅是定义,你调用视图的效果等于直接调用里面的语句,至于会不会,可以分别查看执行计划,如无意外是一样的