首页 新闻 会员 周边 捐助

请问这个sql还有什么方法可以优化?

0
悬赏园豆:50 [已解决问题] 解决于 2010-08-24 10:10

SELECT url_id
     ,Url
,Url_Title
,
MIN([First_Visite_Time]) AS 'First_Visite_Time'
,
MAX([Last_Visite_Time]) AS 'Last_Visite_Time'
,
SUM([User_Count]) + SUM (ISNULL([e_user_count],0)) AS 'UC'
,
SUM([IP_Count]) + SUM (ISNULL([e_ip_count],0)) AS 'IP'
,
SUM([PV_count]) + SUM (ISNULL([e_pv_count],0)) AS 'PV'
,
SUM([Access_Count]) + ISNULL (sum([e_visite_count]),0) AS 'Access_Count'
FROM [report_LinkInfo]
where dt>='2010-7-1' and dt<='2010-8-2'
GROUP BY Url_Id,Url,Url_Title
order by [PV] DESC, [IP] DESC

 

通过查看执行计划,大部分的时间都花在group by字段和order by字段进行排序,原表在Url_Id,Url,Url_Title字段中已经创建了非聚集索引,但加上order by字段后,就失效了,去掉order by就非常快

vento的主页 vento | 菜鸟二级 | 园豆:237
提问于:2010-08-09 18:09
< >
分享
最佳答案
0

你这个是网站统计系统的报告吧。因为你这个 pv , 和 ip 是计算的中间值。所以,很难再进行优化了。

一般的解决方案是创建一个汇总表。保存你上面SQL汇总的信息。

如果当天已经过去了,汇总过一次了以后,以后就不会再汇总了,用一个表缓存是很划算的。

如果你是要实现当天即时的,那么我建议你建立一个表,专门保存当天的汇总。然后5分钟,汇总一次。

汇总之前清空表。

收获园豆:50
暮夏 | 菜鸟二级 |园豆:391 | 2010-08-09 20:31
现在做不了汇总表,因为系统可以给用户随意选择时间段
vento | 园豆:237 (菜鸟二级) | 2010-08-09 21:00
@vento:时间段是按照,分钟,小时,还是天。如果是天,是可以汇总的。如果分钟,小时这样选择的话,如果你网站访问量非常大的话,可以考虑每分钟做汇总,或者一个小时做汇总,要比你从原始表里面查肯定快很多。
暮夏 | 园豆:391 (菜鸟二级) | 2010-08-09 21:17
现在按天,能不能说详细点?
vento | 园豆:237 (菜鸟二级) | 2010-08-10 16:50
按天就按照我说的就可以了,每天的数据都汇总好。然后按照时间的范围,把每天的再做一次加和。还有一点要注意,尽量保持表的大小要小,所以尽量不要把url字段放入这个表中,我以前项目中,也做过类似的,虽然pv有100多万,但是每天访问的文章数目就是5000左右,一年的数据不过 150万左右。再汇总速度就很快了。如果你从原始表里面进行查询,那至少也是几亿的数据,肯定是不合理的。 而且,你可以引导用户的查询时间,如果按月,按星期,再进行一下汇总,然后用户一般会喜欢看看本周的,上周的,本月的,本季度的,一年的数据,很少有用户会去刻意选一个时间,我们后台统计出来是,10个用户,只有一个用户会去刻意的选一个时间段,所以,在界面上做适当的引导,可以减少你服务器的很大的负载。当然,如果就一两个用户使用,那就无所谓了。
暮夏 | 园豆:391 (菜鸟二级) | 2010-08-13 21:58
其他回答(3)
0

order by 之前的建立视图,对视图Order by 应该可以。

winzheng | 园豆:8797 (大侠五级) | 2010-08-09 19:16
0

试试先读到表变量中再order by 排序

邀月 | 园豆:25475 (高人七级) | 2010-08-09 19:30
0

建议给dt字段加上聚合索引,如果是日期类型的话。

Astar | 园豆:40805 (高人七级) | 2010-08-10 08:48
【DT】字段加了索引,一次select出来符合条件的记录数大概30万,order by会导致对该30万记录进行排序,所以非常慢
支持(0) 反对(0) vento | 园豆:237 (菜鸟二级) | 2010-08-10 16:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册