在数据库上创建变量以保存全局统计信息

pri*_*inn 5 sql sql-server variables sql-server-2005

让我们假装我有一个社交网络.我总是向用户显示已注册的用户数量并激活了他们的个人资料.因此,每次单个用户登录时,都会转到DB并创建一个:

select count(*) from users where status = 'activated'
Run Code Online (Sandbox Code Playgroud)

因此,如果5.000用户登录,或者只是刷新页面,它将向上面的SQL发出5.000个请求.我想知道是否有更好的变量某些地方(我仍然不知道放在哪里)每次用户激活他的个人资料时将添加1然后,当我想显示有多少用户注册到该社交网络时,我只会得到这个变量的值.

我该怎么做?对我所拥有的东西来说,它真的是一个更好的解决方案吗?

Dam*_*ver 2

您可以使用索引视图,SQL Server 将自动维护该视图:

create table dbo.users (
    ID int not null,
    Activated bit not null
)
go
create view dbo.user_status_stats (Activated,user_count)
with schemabinding
as
    select Activated,COUNT_BIG(*) from dbo.users group by Activated
go
create unique clustered index IX_user_status_stats on dbo.user_status_stats (Activated)
go
Run Code Online (Sandbox Code Playgroud)

这只有两种可能的状态,但可以使用不同的数据类型扩展到更多状态。正如我所说,在这种情况下,SQL Server 将在幕后维护计数,因此您只需查询视图即可:

SELECT user_count from user_status_stats with (NOEXPAND) where Activated = 1
Run Code Online (Sandbox Code Playgroud)

并且它不必查询基础表。您需要使用WITH (NOEXPAND)以下版本(企业/开发人员)的提示。


尽管正如 @Jim 建议的那样,当索引列可以满足使用相等比较的查询条件时,对索引执行 COUNT(*) 也应该很快。