sql - 从有条件的表中获取计数的最快方法?
问题描述
我正在使用 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。我只需要快速的东西。
解决方案
考虑创建一个索引视图来实现聚合:
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);
推荐阅读
- r - 如何在 R 和 Stata 中创建 2000 个观察值的随机虚拟变量?
- c# - linq计数二次分组和计数不分组
- c++ - 为什么 C++20 中的 [[likely]] 属性会在此处引发警告?
- python-3.x - 嵌套子列表中的元素数(从第一个索引开始)
- reactjs - 用户登录后如何调用 Firestore 数据库?
- service-worker - 如何检测离线状态的service_worker响应,并渲染离线页面而不是继续程序的常规流程?
- git - 是否可以将文件的历史记录从 git 分支传送到另一个(使用命令行)
- docker - 有关在 Google Cloud App Engine 上部署 Meteor 应用程序的问题:APP_CONTAINER_CRASHED
- ruby-on-rails - 如何动态设置简单表单输入的“名称”属性
- javascript - 如何按类别获取具有最小值的对象