从SQL表缓存计数的最佳方法?

时间:2009-07-06 11:21:44

标签: sql-server-2005 caching count

我想从头开发一个有特殊需求和定制的论坛。

我想准备我的论坛以供密集使用,并想知道如何缓存用户帖子数量和用户回复计数等内容。

只有三个表,tblForum,tblForumTopics,tblForumReplies,缓存用户主题和回复计数的最佳方法是什么?

在一个简单的场景中思考:用户按下一个链接并打开Replies.aspx?id = x& page = y页面,然后开始阅读回复。在HTTP请求上,服务器将运行一个SQL命令,它将获取该页面的所有回复,“内部加入tblForumReplies以查找每个回复用户的用户回复数。”

select 
    tblForumReplies.*,
    tblFR.TotalReplies
from 
   tblForumReplies
   inner join 
     (
       select IdRepliedBy, count(*) as TotalReplies
       from tblForumReplies
       group by IdRepliedBy
     ) as tblFR 
     on tblFR.IdRepliedBy = tblForumReplies.IdRepliedBy

不幸的是,这种方法非常密集,我想看看你如何缓存像表计数这样的东西的想法。

如果在插入/删除时计算每个用户的回复,并将其存储在单独的字段中,如何与手动数据更改同步。假设我将手动删除SQL中的回复。

4 个答案:

答案 0 :(得分:4)

这是我想到的三种方法:

1)也许SQL Server性能足够好,您不需要缓存。您可能低估了SQL Server可以完成其工作的程度。如果你正确地进行连接,那么只需要一个查询来获取该线程中所有用户的所有计数。如果您将此视为每个用户一个查询,那就错了。

2)不要缓存。冗余地将用户计数存储在用户表中。每当插入或删除帖子时,都要更新用户行。

3)如果您拥有数千个用户,甚至数千个用户,甚至数千个用户,您可能会发现将用户及其计数缓存在Web层的内存中是实用的 - 对于ASP.NET,即“应用程序”缓存。

答案 1 :(得分:2)

我不打扰缓存,直到我肯定会需要这个。从我的经验来看,这无法预测需要缓存的地方。尝试迭代方法,尝试实现无效的cashe,然后gether统计,然后实现正确的缓存(有很多种类,如内容,数据,聚合,分布式等)。

顺便说一句,我不认为您的查询是CPU消耗。 SQL服务器将优化那些东西,COUNT(*)将在ticks中运行......

答案 2 :(得分:2)

tbl前缀很糟糕 - 与Replies.aspx?id=x&page=y URI一样多。考虑ASP.NET MVC或只是路由部分。

其次,不要过早优化。但是,如果您确实需要,请对数据进行非规范化:将TotalReplies列添加到ForumTopics表中,并依赖DAL / BL保持此字段为最新状态(可能需要重新同步计划任务)那些),或使用触发器。

答案 3 :(得分:1)

对于每个回复,您需要保留TotalRepliesTotalDirectReplies。这样,您可以支持树状结构的回复,并在整个层次结构中保持计数更新,而无需每次都计算。