日期:2014-05-18  浏览次数:20541 次

sql 优化问题
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 ',42

select   name,sum(m)as   mm   from   t  
group   by   name
having   sum(m)> 33

当数据量有几十万条时,当我要取sum(m)大于某个数的所有name的时候,因为还要和其它表链接,select的字段也比较多,大概有20个,用having感觉很慢。不知道还有别的更好的方法吗?

------解决方案--------------------
感觉having是最好的
------解决方案--------------------
select name,sum(m)as mm from t group by name having sum(m)> 33

------
就语句本身来说,我感觉已无从优化了
------解决方案--------------------
IO肯定是很大,建议你拆分到循环里,先弄一个DISTINCT NAME的游标或临时表,然后一个NAME一个NAME 的循环产生结果。这样IO能小一些,虽然时间长,但不会死
------解决方案--------------------
从执行计划里看看成本最高的环节在哪里,然后再解决吧,
从语句上看不出什么问题,另外楼主的索引是怎么建的也不清楚啊,所以先分析执行计划
------解决方案--------------------
看来只能从你连接的表里面去优化了。