【问题标题】:SQL Optimize Group By QuerySQL 优化按查询分组
【发布时间】: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 alwaysKNOW 如果您的插入/更新/删除速度太慢,您的索引过多,并且用于读取的索引速度不足以弥补它。

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


【解决方案1】:

查询最后一天没什么大不了的,因为您已经有一个日期列,可以在其上放置索引。

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

要查询上一小时,您可以在 myTable 中添加列 [hour] 并结合日期查询它

【讨论】:

    【解决方案2】:

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

    可能是关于种类、名称的复合索引
    或者试试名字,种类
    或仅命名

    我认为查询优化器足够聪明,这不是一个因素,而是将分组切换为名称,因为名称更独特

    如果 kind 不是很独特(只有 1 和 2),那么最好不要索引

    我整理你的索引

    【讨论】:

      猜你喜欢
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多