存储总值或在运行时总结的最佳实践

时间:2012-09-22 19:11:13

标签: sql

我有一个应用程序,其中每个“作业修订版”都有许多计算 - 这涉及链接到该修订版的多行的总和。

我想知道的是最佳做法是:

  1. 在作业修订版上存储“总数”,以便我们可以在不加总结的情况下显示
  2. 在向用户显示时计算运行时的总数

1 个答案:

答案 0 :(得分:7)

这在很大程度上取决于几个因素,例如:

  • 准确度有多重要?从数字显示的那一刻起,数字是否需要准确无误?
  • 检索速度有多重要?是否更准确地显示数字是否更准确?
  • 写作速度有多重要?是否更快地将每个“行”写入?
  • 涉及多少数据?我们是在谈论数百万行还是数百行?
  • 多个行同时更新的频率是多少?一般情况下,“工作修订”的许多行是一次更新的,还是更有可能一次只涉及一行?

每一项都有不同的权衡取舍,并且有多种选择可以满足各自的平衡。

  • 每次插入,更新或删除新行时,您都可以创建更新“缓存”总计的触发器。这将确保准确性和快速检索,但会减慢写入速度,因为它每次都会涉及“缓存”表的额外更新,而这又涉及行级锁定以确保数字保持准确。锁定减慢其他操作的速度将取决于同一“工作修订”的其他操作同时发生的频率。
  • 您每次都可以计算该值。这可确保值准确,并且插入/更新速度很快,但计算该值可能效率低且速度慢。
  • 您可以将值存储在缓存表中,但只能定期更新。这样可以确保读取和写入都很快,但代价是准确性。

如果你只处理少数行,那么这些行之间没有太大区别,并且“每次只计算它”就可以了。如果没有实际需要让事情变得更快,那么每次计算都需要“更多normal

一如既往:不要只询问一般情况下的好处。描述您自己的代码,查看瓶颈所在,并倾向于遵循“Don't, yet”规则。