在主表中存储计数

时间:2013-04-22 10:43:38

标签: sql performance count

我有三个数据库表,

  1. Users(UserID,...)
  2. Entries(EntryID,...)
  3. Likes(UserID,EntryID,...)
  4. 我的问题很简单。我应该在表LikeCount中使用Entries列,还是每次从SELECT COUNT(*)表中需要时使用Likes语句?哪一个是更好的做法?

    这个问题可能重复:storing the count of rows or just count the rows?该问题的答案基本上不使用LikeCount,而是每次需要时计算。但是,他们没有对以下问题给出满意的答案:

    1. 在表中存储计数的不良后果是什么
    2. 如果我需要在我的应用程序中经常计算喜欢,那么这两种不同方法的性能分析是什么
    3. PS:如果重要的话我使用SQL Server 2008

1 个答案:

答案 0 :(得分:3)

在表格中存储计数的不良后果是什么:

这种方法存在两个问题:

  1. 您必须使用数据库触发器或应用程序代码,以便在Likes表更改时使计数保持最新。

  2. 如果你错了#1,你必须处理LikeCount实际上可能与喜欢的数量不匹配这一事实。

  3. 如果我需要在我的应用程序中非常频繁地计算喜欢,那么这两种不同方法的性能分析是什么:

    我相信如果你为Likes表创建了一个索引,大多数数据库引擎都能够非常快速地回答COUNT(*)查询,而无需引用实际的表。基本上,在索引中,数据库会跟踪与给定键匹配的行数,这与您的LikeCount相同。

    如果您要编写如下查询:

    SELECT count(*) from Likes where EntryID=45;
    

    然后你的索引必须在EntryID上。

    但是,如果你打算写一个像这样的查询:

    SELECT count(*) from Likes where EntryID=45 and deleted=False;
    

    然后你的索引必须打开(EntryID,删除)。