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然后,当我想显示有多少用户注册到该社交网络时,我只会得到这个变量的值.
我该怎么做?对我所拥有的东西来说,它真的是一个更好的解决方案吗?
您可以使用索引视图,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(*) 也应该很快。