【发布时间】:2014-06-03 01:29:21
【问题描述】:
我有一个包含近 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 秒才能运行,并且看起来在索引查找操作中正在读取大量数据。有什么办法可以加快这个查询?我读过在更大的数据集上计数会变慢,并且有更快的方法来获取整个表的计数,但我需要按类别获取计数。
【问题讨论】:
-
添加聚集索引肯定会有帮助。
-
图表显示索引查找发生在不是 idx_SaleCategory 的 Table1.Index1 上。您似乎没有从新索引中受益。
-
@M.Ali - 这将有助于 此查询,但总体上可能是聚集索引的错误选择。
-
您也可以尝试添加
WITH NOLOCK。如果您每秒获得多个更新,您可能会遇到争用。 -
使用 COUNT(CategoryId) 而不是 COUNT(*)。
标签: sql sql-server performance