首页 > 解决方案 > 从有条件的表中获取计数的最快方法?

问题描述

我正在使用 sql server 2017 和 EF Core 2.2。我的一张表现在有 500 万条记录。

我想按“CategoryId”对所有这些记录进行分组,然后对每个记录进行计数。

我还需要使用 where 子句进行过滤。

但是,即使我在 Sql 中编写查询,仍然需要大约一分钟才能得到这些数字。

这太慢了,我需要更快的东西。

select CategoryId, count(*) from Items where Deleted = 'False'
group by CategoryId

我猜 EF 核心可能没有足够快的解决方案,所以我愿意在需要时使用 ado.net。我只需要快速的东西。

标签: sqlsql-serverperformancecount

解决方案


考虑创建一个索引视图来实现聚合:

CREATE VIEW dbo.ItemCategory
WITH SCHEMABINDING
AS
SELECT CategoryId, COUNT_BIG(*) AS CountBig
FROM dbo.Items
WHERE Deleted = 'False'
GROUP BY CategoryId;
GO

CREATE UNIQUE CLUSTERED INDEX cdx_ItemCategory
    ON dbo.ItemCategory (CategoryId);
GO

将此视图用于聚合结果将显着提高性能:

SELECT CategoryId, CountBig
FROM dbo.ItemCategory;

根据您的 SQL Server 版本,您可能需要指定NOEXPAND要使用的视图索引的提示:

SELECT CategoryId, CountBig
FROM dbo.ItemCategory WITH (NOEXPAND);

推荐阅读