2013-10-07 49 views
0

有没有一种方法可以优化下面的查询。使用Case和select语句中的操作优化SQL查询

目前,它大约需要2分钟,运行

我使用MS SQL。 Records_Table拥有近900万条记录。日期字段存储在以30个分钟间隔,并有60种不同类型的群体

declare @date datetime 
set @date = convert(datetime,'16/sep/2013',104) 

SELECT 
[Group], 
CASE WHEN (SUM(A) + SUM(B)) = 0 THEN 0 ELSE 
CAST(SUM(C) AS decimal(18, 2))/(SUM(A) + SUM(B)) * 100 END AS Calculation 
FROM Records_Table 
WHERE date BETWEEN @Date AND @Date + 6 
GROUP BY [Group] 

请注意,我需要的数据整整一个星期,所以我给自己定的条件为日之间@date与@date + 6

任何帮助将不胜感激。

感谢

+0

你的桌子上有什么索引? – GarethD

+0

我跑了下面的查询,我没有得到任何结果(因此,没有):select * from sys.indexes where object_id =(从sys.objects选择object_id where name ='Records_Table') – Selrac

+1

我建议索引然后选择日期,然后将所需的列作为非关键列添加。例如CREATE INDEX IX_RecordsTable_Date ON Records_Table(Date)INCLUDE([Group],A,B,C)' – GarethD

回答

0

尝试分区您的表基于日期,因为我的理解主要是基于日期的条件,你可以简单地创建日期指标,但由于900万行,你有我喜欢的分区。

+0

我需要管理员访问权限来创建分区吗?有什么办法呢? – Selrac

+0

您必须具有该表上的ALTER OBJECT权限 – VahiD

0

我会建议一个关于(日期,组)的索引,以便日期针对有问题的日期范围进行优化,并且通过集合的限定词对该组进行优化。