Sql 存储总值或在运行时求和的最佳实践

Sql 存储总值或在运行时求和的最佳实践,sql,Sql,我有一个应用程序,其中每个“职务修订”都有许多计算——这涉及到链接到该修订的多行的总和 我想知道的是,最好的做法是: 在作业修订版上存储一个“总计”数字,这样我们就可以在不求和的情况下显示它 向用户显示时计算运行时的总计 这在很大程度上取决于几个因素,例如: 准确性有多重要?在显示图形时,图形是否需要精确 检索速度有多重要?及时显示数字比准确更重要吗 写作速度有多重要?快速写入每个“行”是否更重要 涉及多少数据?我们说的是数百万行,还是数百行 多行同时更新的频率是多少?通常情况下,“作业修订”

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

我想知道的是,最好的做法是:

  • 在作业修订版上存储一个“总计”数字,这样我们就可以在不求和的情况下显示它
  • 向用户显示时计算运行时的总计

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

    • 准确性有多重要?在显示图形时,图形是否需要精确
    • 检索速度有多重要?及时显示数字比准确更重要吗
    • 写作速度有多重要?快速写入每个“行”是否更重要
    • 涉及多少数据?我们说的是数百万行,还是数百行
    • 多行同时更新的频率是多少?通常情况下,“作业修订”的多行同时更新,还是一次只涉及一行
    其中每一项都有不同的权衡,并且有多种选择来满足每一项的平衡

    • 您可以创建触发器,每次插入、更新或删除新行时都会更新“缓存”总数。这将确保准确性和快速检索,但会降低写入速度,因为每次都需要额外更新“缓存”表,这反过来又需要行级锁以确保数字保持准确。锁对其他操作的减速程度取决于同一“作业修订”上的其他操作同时发生的频率
    • 您可以每次计算该值。这样可以确保值准确,插入/更新速度快,但计算值可能效率低且速度慢
    • 可以将值存储在缓存表中,但只能定期更新。这确保了读写速度都很快,但以牺牲准确性为代价
    如果您只处理少数几行,那么这些行之间没有太大区别,并且“每次都计算”就可以了。如果没有实际需要使事情更快,那么每次计算都被认为是“更多”

    一如往常:不要只要求在一般情况下好的东西。分析您自己的代码,查看瓶颈在哪里,并倾向于遵循规则。“

    视情况而定

    如果有一种方便的方法可以在进行过程中计算出来,那么您就不需要一个可能很昂贵的查询来计算出来。然而,预计算的最大问题是,在维护总量和数据时,您可能会遇到额外的复杂性

    这是设计上的折衷,所以没有正确的答案告诉你最终会在哪里结束。我想说的是,你应该把总数的预先计算作为一种选择,因此,如果你还不知道你需要这样做,那么这是一种过早的选择

    如果事情不协调,您最终可能需要做大量的工作来整理数据。如果他们在未修复的bug或未堵塞的漏洞中步调一致,这将是一项重要的持续工作


    这不是您需要或事实上不必急于解决的问题。

    如果您的数据库支持物化视图(如Oracle)或类似构造,则这是另一种选择。这样的数据库可以提供针对物化视图的查询重写选项。