数据库是sql2008,库中有两个表,Table1和Table2
表Table1中有800万数据,我对Table1创建了分区表,按时间字段分区,需要查询的字段都建立了非聚集索引,查询表Table1速度很快。表Table2中有15万数据,由于数据量不大所有没有创建分区表,只是对需要查询的字段建立了非聚集索引,查询表Table2速度也很快。现在我需要同时查询表Table1所有字段和表Table2中的几个字段,于是我建立了视图,也是用时间字段连接,语句如下:
SELECT a.*,(SELECT TOP 1 Table2Field FROM Table2 WHERE Time=a.Time) AS Table2Field FROM Table1 a
可查询速度比较慢,请问有何方法能提高查询效率?谢谢!

解决方案 »

  1.   

    ctrl+l   看下执行计划
      

  2.   

    select a.* , b.Table2Field 
    from Table1 a , Table2 b
    where a.time = b.time and b.Table2Field = (select top 1 Table2Field from table2 where time = b.time)
      

  3.   


    嵌套循环(Left Outer Join)开销1%
    索引扫描(NonClustered) 开销3%
    聚集索引查找(clustered) 开销95%其余开销均为0%
      

  4.   


    刚才这样查询我测试了下,速度依然比较慢,我试过很多种写法,感觉单纯优化SQL语句没什么作用。
      

  5.   


    之前Table2表Time是非聚集的,我改成了聚集的,后者比前者就快1秒钟,但是查询仍然比较慢。
    Table1表的Time是非聚集的,但Table1的Time有分区。
      

  6.   


    Time改成非聚集 执行计划为嵌套循环(Left Outer Join)开销1%
    排序(Sort)开销30%
    索引扫描(NonClustered) 开销3%
    并行序(Repartition Streams)开销1%
    表假脱机(Lazy Spool)开销65%其余开销均为0%
      

  7.   

    直接连接不行么:
    SELECT distinct a.*,b.Table2Field FROM Table1 a inner jion Table2 on a.Time=b.time
      

  8.   

    他这个不是查询速度慢的问题,是需求的问题.
    要从相同的TIME中找第一个table2field,而且还要关联表,快得起来才怪了.
      

  9.   

    需求决定速度.要快的话,简单,在table2表中加个字段,把每个time的第一条记录标记为1.然后对TIME,flag建立索引,然后再关联表. a.time = b.time and b.flag = 1
      

  10.   

    在 time 列上建索引试试.
      

  11.   

    采取两种方法:
    1.
    select
     a.* , b.Table2Field 
    from
     Table1 a , Table2 b
    where
     a.time = b.time 
    and
     b.Table2Field = (select max(Table2Field) from table2 where time = b.time)2.---不用distinct  用group bySELECT 
     a.*,b.Table2Field 
    FROM
     Table1 a inner join Table2 on a.Time=b.time
    group by
      .....
    两种方法TIME字段都加上索引
      

  12.   


    time上建了索引,一直都有的。
      

  13.   

    2005+试下SELECT a.*,b.Table2Field 
    FROM Table1 a outer apply 
    (SELECT TOP 1 Table2Field FROM Table2 WHERE Time=a.Time) b
      

  14.   

    聚集索引查找(clustered) 开销95%这里是对Table1的聚集索引扫描,原因是你的语句一次返回了Table1的所有800万数据,这样做的必要性需要楼主自己考虑清楚,否则,反正需要返回全表,索引和分区没有作用,基本无法优化。