create table t(id int PRIMARY KEY ,name varchar(20),m money)
INSERT t SELECT  1,'a',11
UNION ALL SELECT 2,'a',15
UNION ALL SELECT 3,'b',16
UNION ALL SELECT 4,'b',17
UNION ALL SELECT 5,'c',27
UNION ALL SELECT 6,'c',57
UNION ALL SELECT 7,'c',62
UNION ALL SELECT 8,'b',123
UNION ALL SELECT 9,'b',45
UNION ALL SELECT 10,'a',42select name,sum(m)as mm from t 
group by name
having sum(m)>33当数据量有几十万条时,当我要取sum(m)大于某个数的所有name的时候,因为还要和其它表链接,select的字段也比较多,大概有20个,用having感觉很慢。不知道还有别的更好的方法吗?

解决方案 »

  1.   

    select name,sum(m)as mm from t group by name having sum(m)>33------
    就语句本身来说,我感觉已无从优化了
      

  2.   

    IO肯定是很大,建议你拆分到循环里,先弄一个DISTINCT NAME的游标或临时表,然后一个NAME一个NAME 的循环产生结果。这样IO能小一些,虽然时间长,但不会死
      

  3.   

    用游标肯定是不好的了。
    select name,sum(m)as mm from t group by name having sum(m)>33
    这句是没有什么优化的。有没有更好的方法去替换having呢?