比较1、2、3性能
1 的性能优于 2,原因:2方案的子查询返回了B表的结果集,任何结果集的返回都会消耗SQL的资源。如果将二方案改为EXISTS子查询其查询效果等于1。比较4
2优于1,原因同上比较5
采用临时表性能未必会提高,原因很简单,临时表没有索引,若将临时表与另一个表连接,将对临时表进行全表扫描,临时表记录越多,效率越低
1 的性能优于 2,原因:2方案的子查询返回了B表的结果集,任何结果集的返回都会消耗SQL的资源。如果将二方案改为EXISTS子查询其查询效果等于1。比较4
2优于1,原因同上比较5
采用临时表性能未必会提高,原因很简单,临时表没有索引,若将临时表与另一个表连接,将对临时表进行全表扫描,临时表记录越多,效率越低
select u.* from (select userNo,agentId,activityId from UserInfo where createDate between x1 and x2
是不是在查询的时候会执行N次?而如果将这个子查询的结果插入到一个临时表后引用这个表,性能是否有明显改善?-----是的,最好使用表变量,而不是临时表.6. 有人说查询视图等同于执行视图的SQL语句,当一个复杂SQL多次关联视图时,是否也多次执行视图的查询SQL呢?-----是的.
4:后者快于前者
5:看不懂
6:不要多次调用视图,可以不用的视图的尽量不要用
2. SELECT A.* from A INNER JOIN (SELECT * FROM B WHERE B.sampleDate between x1 and x2) ON A.id=B.id
3. SELECT A.* from A ,B WHERE A.id=B.id and B.sampleDate between x1 and x2
其中B是视图---1,2,3的执行计划是一致的 所以性能是相同的 不知道你们怎么看出来不同的4. SELECT A.*,(select name from Agent where agentId=A.agentId) FROM A
与 SELECT A.*,c.name FROM A,Agent c WHERE c.agentId=A.agentId 是一样吗?---不一样 第一句的语法有问题 在name返回多行的情况下报错 5. 另外,在一条复杂语句中多处用到下列子查询:
select u.* from (select userNo,agentId,activityId from UserInfo where createDate between x1 and x2)u
是不是在查询的时候会执行N次?而如果将这个子查询的结果插入到一个临时表后引用这个表,性能是否有明显改善?---一个语句只执行一次 但是表/索引有可能扫描多次 采用临时表存放中间结果的方式可以提高查询的性能 当然这不是绝对的6. 有人说查询视图等同于执行视图的SQL语句,当一个复杂SQL多次关联视图时,是否也多次执行视图的查询SQL呢?---查询视图等于执行视图的语句吗?显然是错误的 这个一般不会吧 总之根据查询计划来判断---
2. SELECT A.* from A INNER JOIN (SELECT * FROM B WHERE B.sampleDate between x1 and x2) ON A.id=B.id
3. SELECT A.* from A ,B WHERE A.id=B.id and B.sampleDate between x1 and x2
其中B是视图---速度依次是 1》3》24. SELECT A.*,(select name from Agent where agentId=A.agentId) FROM A
与 SELECT A.*,c.name FROM A,Agent c WHERE c.agentId=A.agentId 是一样吗?---不一样 第一句的语法有问题 在name返回多行的情况下报错
这条语句在写sql时最好不使用,因为在使用时必须确定是一条语句,必然用聚合函数或者是top语句。表/索引有可能多次重复扫描
例如: 表a 总记录为 N 如果运行程序 他就要执行 N*N5. 另外,在一条复杂语句中多处用到下列子查询:
select u.* from (select userNo,agentId,activityId from UserInfo where createDate between x1 and x2)u
基本等于浪费了两倍的资源(慢)