估计跟你的查询和索引设计有关如果同样的数据, 同样的查询, 没有索引比有索引快, 那多半是索引的统计信息不正确, 或者是碎片太多试试使用 dbcc dbreindex 重建一下索引另外, 在查询分析器中看看执行计划中有没有红色的部分, 如果有, 则说明缺少统计信息, 你应该把数据库的自动更新统计和自动创建统计这两个选项打开

解决方案 »

  1.   

    我看了一下建立的索引,是以站号和时间双索引,而且站号在前时间在后,我的查询是一条语句全查,语句是这样的:
    "select a.站名, a.区站号, a.经度, a.纬度, b.total from (select 站名, 区站号, 经度, 纬度 from statparazhou where 区站号 like 'H____') a INNER JOIN (SELECT 区站号, SUM(CONVERT(bigint, 一小时雨量)) AS total , count(*) as tj FROM tabTimeData WHERE 日期时间 between '20080120 06:00:00' AND '20080121 05:00:00' AND 一小时雨量 IS NOT NULL GROUP BY 区站号) b ON a.区站号 = b.区站号 where b.tj=24"
    我也看了一下别人做的存储过程,他是一个站一个站进行合计的,用了一个循环来实现的.我想是不是这样的,因为他是以站号和时间的双聚合索引,站号在前,因此他的查询语句的执行效率高,而我的就慢,如果以时间在前站号在后我的效率就高了呢?
    请zjcxc 和大家帮我分析一下.
      

  2.   

    感觉这个站号+时间的聚集索引利用价值不高 可以考虑把两表select into出来做一个拷贝 分别为站号列和时间列做非聚集索引
      

  3.   

    select * into statparazhou2 from statparazhou 
    select * into tabTimeData2 from tabTimeData 
    add index ix_stat2_qzh on statparazhou2(区站号)
    add index ix_timdata2_qzh on tabTimeData2(区站号)
    add index ix_timdata2_rq on tabTimeData2(日期时间)select a.站名,a.区站号,a.经度,a.纬度,b.total from statparazhou2 a 
    inner join
    (SELECT 区站号, SUM(CONVERT(int, 一小时雨量)) AS total, count(*) as tj 
    FROM tabTimeData2 
    WHERE 日期时间 between '20080120 06:00:00' AND '20080121 05:00:00' AND 一小时雨量 IS NOT NULL 
    having count(*)=24 
    GROUP BY 区站号) b 
    ON a.区站号=b.区站号 
    where a.区站号 like 'H____'  
      

  4.   

    "select   a.站名,   a.区站号,   a.经度,   a.纬度,   b.total   from   (select   站名,   区站号,   经度,   纬度   from   statparazhou   where   区站号   like   'H____')   a   INNER   JOIN   (SELECT   区站号,   SUM(CONVERT(bigint,   一小时雨量))   AS   total   ,   count(*)   as   tj   FROM   tabTimeData   WHERE   日期时间   between   '20080120   06:00:00'   AND   '20080121   05:00:00'   AND   一小时雨量   IS   NOT   NULL   GROUP   BY   区站号)   b   ON   a.区站号   =   b.区站号   where   b.tj=24" 
    ----------------------------------------------------
    1)蓝色部分在小表上,问题估计不大。
    2)对于红色部分,你可以考虑在“日期时间”上建聚合索引。
    因为你的那个有500万记录的表是按时间递增的,且不会修改时间,而且使用BETWEEN做查询,
    所以在这个字段上建聚合索引会比较有效。
    对于聚合索引,最好不要使用多个字段,一个字段是最有效的。
    如果你要使用多个字段,那么用INCLUDE把多的字段包含进去,但你的情况没有这个必要。
    3)然后在“区站号”上另外建一个普通索引就可以。老大在1楼和2楼建议的方法是很经典的,不管怎么改索引,还要看查询计划是什么样的。
      

  5.   

    感谢各位,我们单位职权分的很细,数据库管理是别的科的任务.没有办法建索引,我和他们说建索引,他们认为是在推责任,而且他们认为他们的查询很快,就不是他们的责任.就不管了,把责任全推到我的身上,老上火了.没办法啊.我现在做了个实验,我先用一个dataset读出站名站号等信息,然后在数据表中进行1000多次的单站数据统计,居然只用了30多秒.看来真是数据基础决定上程应用啊.