【发布时间】:2015-10-17 15:54:13
【问题描述】:
我在这里有一个表格,其中包含以下字段: ID,姓名,种类。日期
数据:
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 语句了。
【问题讨论】:
-
首先,你的sql语句都不是有效的sql。第一个
where子句缺少任何条件,在第二个示例中,from之前有一个where,第二个where子句再次没有任何条件。 -
对于初学者,您可以在日期列或 where 子句中的所有列上添加索引。
-
@FrankToast 您是否检查过查询的执行计划?拥有大量索引并不总是好的,它可能会产生不利影响。
-
我在相关列上有非聚集索引,过多的索引怎么会减慢读取过程(当然是为了写入)
-
@FrankToast 上面的关键字是
not always。KNOW如果您的插入/更新/删除速度太慢,您的索引过多,并且用于读取的索引速度不足以弥补它。
标签: sql-server tsql group-by query-optimization large-data