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就非常快
你这个是网站统计系统的报告吧。因为你这个 pv , 和 ip 是计算的中间值。所以,很难再进行优化了。
一般的解决方案是创建一个汇总表。保存你上面SQL汇总的信息。
如果当天已经过去了,汇总过一次了以后,以后就不会再汇总了,用一个表缓存是很划算的。
如果你是要实现当天即时的,那么我建议你建立一个表,专门保存当天的汇总。然后5分钟,汇总一次。
汇总之前清空表。
order by 之前的建立视图,对视图Order by 应该可以。
试试先读到表变量中再order by 排序
建议给dt字段加上聚合索引,如果是日期类型的话。