5、每次按条件读取视图数据时,SQL执行顺序是怎么样的呢?是先按条件先从原表筛选出数据,然后再组成视图形式的数据集,还是
先按照视图条件形成虚表,然后再按照条件返回数据呢?如果是后者,当组成视图数据越来越多的时候,对于我前面所说的查询是否会越来越慢呢? 关于这个大家怎么看?
先按照视图条件形成虚表,然后再按照条件返回数据呢?如果是后者,当组成视图数据越来越多的时候,对于我前面所说的查询是否会越来越慢呢? 关于这个大家怎么看?
在少量数据时,两个似乎没有什么差别,
在大量数据时,似乎VIEW更快点吧
因为相对于直接连表的查询语句而言,它省去了编译时间
相对于存储过程而言,sql对中间对象处理略简单些.
但实际上对于你这样的查询语句,三者没有区别. 原因很简单,是数据量大,而不是语句复杂.但是你举的例子根本不对等,存储过程返回了两个行集,视图和查询语句都只一个行集.5,
如果
create view v
as
select a.a x,a.b y,b.c z from a inner join b on a.x=b.x where a.y='z'
这样,然后再执行
select * from v where x='aaaa'相当于执行
select * from
(
select a.a x,a.b y,b.c z from a inner join b on a.x=b.x where a.y='z'
) v
where x='aaaa'它是将子查询先产生结果集缓存到内存后再执行where x='aaaa'的过滤呢?
还是直接把 where x='aaaa'放到里面去, 这个,你一看查询计划就知道了.
根具(子查询)内外部的连系,sql会自己转化的.
---------------------------------------------------
楼主太多虑这些了。这是SQL引擎要考虑的事情。
如果你很想看SQL引擎到底使用那种方法,可以打开execution plan看一下。
如果数据很多话,你是真的需要看一下执行计划的,看看可以怎么优化一下。
3、对于这个查询,我想到了种方式:
(1):把表A和表B关联成一个视图,然后用一条SQL语句来实现这个查询:
select a,b,c from view_test where danhao='123'
(2):在一个存储过程里实现:
select a,b from A where danhao='123'
select c from B where danhao='123'
(3):select A.a,A.b,B.c from A join B on A.danhao=B.danao where A.danhao='123'
-------------------------------------------------------------
这3种方法其实差不多。但是存储过程要更有效一些。关于视图的使用原则是,如果能用直接的查询实现,就没有必要使用视图。所以,你的第一种方法大可不必。
因为数据库引擎最终要把视图转化成其对应的物理表,才开始分析和优化查询。视图可以用来简化代码,屏蔽底层表结构,但是对提高性能没有多少帮助。甚至比第三种方法还慢。使用存储过程的好处是,数据库引擎只需要进行一次SQL的解析和优化,省却了很多不必要的步骤。
4、我在想,当表A与表B的数据越来越多的时候,哪种方法会更快一点呢?
-------------------------------------------------------------
数据越来越多的时候,三种方法都会慢。
为你的表建有效的索引和更新统计数据才是最有效的。