SQL Group By with Count很慢

时间:2014-04-25 15:02:42

标签: sql sql-server performance

我有一张近300万行的表,每秒有5-10次更新/插入。每行都分配了一个类别,我想按类别进行分组,以计算每个类别的总行数。

Select CategoryId
     , COUNT(*) as TotalRows
  FROM Table1
 WHERE SaleTypeId = 2 AND CategoryId > 1
 GROUP BY CategoryId

表架构:

CREATE TABLE [dbo].[Table1](
[SaleId]      INT IDENTITY (1, 1) NOT NULL,
[SaleTypeId]  INT                 NOT NULL,
[CategoryId]  INT                 NULL)

主键:

 ADD CONSTRAINT [PK_Table1] 
 PRIMARY KEY CLUSTERED ([SaleId] ASC) 
 WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, 
       IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF);

我在桌面上有一个非聚集索引:

CREATE NONCLUSTERED INDEX [Index1] ON [dbo].[Table1]
(
    [SaleTypeId] ASC,
    [CategoryId] ASC    
)

查询计划:

enter image description here

查询需要40到60秒才能运行,看起来在索引查找操作中正在读取大量数据。有没有办法加快这个查询?我已经读过,在较大的数据集上计数变慢,并且有更快的方法来获取整个表的计数,但我需要按类别计算。

3 个答案:

答案 0 :(得分:1)

反转非聚集索引中的列顺序,如下所示:

CREATE NONCLUSTERED INDEX [Index1] ON [dbo].[Table1]
(
    [CategoryId] ASC,    
    [SaleTypeId] ASC
)

答案 1 :(得分:0)

尝试运行此功能,我还会将索引设为@dean建议

Select CategoryId, COUNT(CategoryId) as TotalRows
 FROM Table1 WITH (NOLOCK)
 WHERE SaleTypeId = 2 AND CategoryId > 1
 GROUP BY CategoryId

答案 2 :(得分:0)

我最终将此作为夜间聚合作业运行并将结果存储在聚合表中。它没有提供最新的结果(经过深思熟虑,我们可以忍受),夜间查询也不会更快,但从汇总表中读取的速度要快得多。