--数据量在130W左右select projectid,username,completestate,count(1) as amount from projectlink201209 where starttime between 
'2012-10-29 00:00:00' and '2012-10-29 23:59:59'  and len(username)>0 and len(username)<14 and 
isnull(completestate,'') in ('C','S','Q') group by projectid,completestate,username

解决方案 »

  1.   

    select projectid,username,completestate,count(1) as amount from projectlink201209 where starttime between 
    '2012-10-29 00:00:00' and '2012-10-29 23:59:59'  and len(username)>0 and len(username)<14 and completestate in ('C','S','Q') group by projectid,completestate,username
      

  2.   

    starttime 字段加索引试试  username  completestate字段加了索引应该也不会走索引  
      

  3.   

    username 这个字段感觉应该是 not null 
    那么语句能修改的地方       AND username <>''
           AND LEN(username) < 14
           AND completestate IN ('C', 'S', 'Q')
    --修改的原则就是尽量不要再where 条件上面使用函数
    使用了函数,这些条件就不可SARG了然后就是补上缺失的索引
      

  4.   

    SELECT   projectid,
             username,
             completestate,
             Count(1) AS amount
    FROM     projectlink201209
    WHERE    starttime BETWEEN '2012-10-29 00:00:00'
                               AND '2012-10-29 23:59:59'
             AND Len(username) > 0
             AND Len(username) < 14
             AND completestate IN ('C',
                                   'S',
                                   'Q')
    GROUP BY projectid,
             completestate,
             username给starttime 、completestate加索引
      

  5.   


    给completestate加索引会走索引吗?
      

  6.   


    最后的条件没有必要判断 isnull,就像2楼那样。completestate 用 in 的话 估计也不会走索引,但这个应该还好吧 不会太慢啊,都在一个表里都没有连接查询。
      

  7.   


    你可以在completestate 字段加索引   我刚刚整了个例子  结果执行计划显示有索引查找这一步  证明还是走了索引的  哈哈
      

  8.   

    1、starttime加聚集索引。
    2、projectid、username、completestate加一个联合非聚集索引
    3、更新表的统计信息
      

  9.   

    如果是08 的话,在completestate上还能加一个filter index(有些译成过滤索引,有些说成筛选索引)