SQL优化按查询分组

时间:2015-07-27 12:46:22

标签: sql-server tsql group-by query-optimization large-data

我这里有一个表格,其中包含以下字段: 我,名字,种类。日期

数据:

id     name     kind   date    
1      Thomas   1      2015-01-01    
2      Thomas   1      2015-01-01    
3      Thomas   2      2014-01-01    
4      Kevin    2      2014-01-01    
5      Kevin    2      2014-01-01    
5      Kevin    2      2014-01-01    
5      Kevin    2      2014-01-01    
6      Sasha    1      2014-01-01

我有一个这样的SQL语句:

Select name,kind,Count(*) AS RecordCount
from mytable 
group by kind, name 

我想知道有多少名字和种类的记录。预期结果:

name     kind     count
Thomas   1        2
Thomas   2        1
Kevin    2        2
Sasha    1        4

问题在于它是一张大表,有超过5000万条记录。

此外,我想知道最后一小时,最后一天,上周等结果,我需要在此添加此WHERE条款:

Select name,kind,Count(*) AS RecordCount      
from mytable 
WHERE Date > '2015-26-07'
group by kind, name 

我将T-SQL与SQL Server Management Studio一起使用。所有相关列都具有非聚簇索引,主键是聚簇索引。

有人有想法如何加快速度吗?

更新:

执行计划说:

  • 选择,计算标量,流聚合,排序,并行:0%成本。
  • 哈希匹配(部分聚合):12%。
  • 聚集索引扫描:88%

抱歉,我忘了检查SQL语句。

2 个答案:

答案 0 :(得分:0)

5000万只是很多行 你无法做任何事情来优化我能看到的查询

可能是种类的综合指数,名称
或尝试名字,种类
或仅命名

我认为查询优化器足够聪明,因为它不是一个因素,但是将组切换到名称,因为名称更独特,所以

如果种类不是很独特(只有1和2)那么你可能会更好地没有指数

我对您拥有的索引进行碎片整理

答案 1 :(得分:-1)

要查询最后一天是没什么大不了的,因为你已经有了一个日期列,你可以把索引放在上面。

对于上周,我会创建一个单独的日期表,每天包含一行,其中包含列ID,日期,星期 你必须预先计算一周。现在,如果您想查询特定的一周,您可以查看日期表,获取日期并仅查询您的tabele mytable 中的那些日期 您应该测试加入日期列是否更高效,或者您最好将myTable中的id列添加为id。对于大表,id可能是更好的选择。

要查询过去一小时,您可以在myTable中添加列[小时],并将其与日期结合使用