我有一张近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
)
查询计划:
查询需要40到60秒才能运行,看起来在索引查找操作中正在读取大量数据。有没有办法加快这个查询?我已经读过,在较大的数据集上计数变慢,并且有更快的方法来获取整个表的计数,但我需要按类别计算。
答案 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)
我最终将此作为夜间聚合作业运行并将结果存储在聚合表中。它没有提供最新的结果(经过深思熟虑,我们可以忍受),夜间查询也不会更快,但从汇总表中读取的速度要快得多。