比较1、2、3性能
1 的性能优于 2,原因:2方案的子查询返回了B表的结果集,任何结果集的返回都会消耗SQL的资源。如果将二方案改为EXISTS子查询其查询效果等于1。比较4
2优于1,原因同上比较5
采用临时表性能未必会提高,原因很简单,临时表没有索引,若将临时表与另一个表连接,将对临时表进行全表扫描,临时表记录越多,效率越低

解决方案 »

  1.   

    5. 另外,在一条复杂语句中多处用到下列子查询:
    select u.* from (select userNo,agentId,activityId from UserInfo where createDate between x1 and x2
    是不是在查询的时候会执行N次?而如果将这个子查询的结果插入到一个临时表后引用这个表,性能是否有明显改善?-----是的,最好使用表变量,而不是临时表.6. 有人说查询视图等同于执行视图的SQL语句,当一个复杂SQL多次关联视图时,是否也多次执行视图的查询SQL呢?-----是的.
      

  2.   

    速度3>2>1
    4:后者快于前者
    5:看不懂
    6:不要多次调用视图,可以不用的视图的尽量不要用
      

  3.   

    谢谢大家精彩点评!我说明一下,“临时表”并非是MSSQL数据库自带的#temp,而是我创建的,只是说我把它当临时表用,用完之后里面的数据就给删了,里面也可能建立了索引。再恳请懂这行的朋友们多多指教!
      

  4.   

    1.  SELECT A.* from A INNER JOIN B ON A.id=B.id WHERE B.sampleDate between x1 and x2
    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呢?---查询视图等于执行视图的语句吗?显然是错误的 这个一般不会吧 总之根据查询计划来判断---
      

  5.   

    1.  SELECT A.* from A INNER JOIN B ON A.id=B.id WHERE B.sampleDate between x1 and x2
    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
    基本等于浪费了两倍的资源(慢)