提供数据计算的最有效方式是什么?一次性全部保存或按要求计算



例如,我有一个表CALCULATE,其中包含val1, val2, val3字段。

现在,我有两个存储/检索数据的选项:
  1. 增加additionmultiplicationdivision列,计算数据保存在INSERT

  2. 先保存数据,然后选择返回计算值

另外,对于选项1,使用过程还是触发器更有效?

这是一个非常简单的例子,我想要找出的是在一个更大的规模,更复杂的公式和更多的数据量,哪种方式会更有效?

您正在权衡存储大小和计算复杂度。当您向表中添加更多列时,您会增加表的大小和读取整个表所需的I/O量。

如果您通常执行需要全表扫描的查询,那么增加的数据大小就是一个问题。

另一方面,将预先计算的值存储在表中有几个优点:

  1. 每行只计算一次。因此,如果您多次检索它们,则可以节省费用。
  2. 您可以索引计算列(在任何数据库中),使您的查询更有效。
  3. 如果你的查询是"大海捞针"查询(也就是说,他们一次只获取几行),那么对性能没有影响。

预计算的最大问题是维护计算值。一种典型的方法是使用"before update"one_answers"before insert"触发器来进行计算。或者,您可以将所有的插入和更新封装在存储过程中,并将这样的业务逻辑放在那里(这就是我通常所做的)。

在大多数情况下,存储过程和触发器之间的性能差异应该完全可以忽略不计。如果您正在尝试在高吞吐量环境中优化性能,那么您应该在dba.stackoverflow.com上询问这个问题,并提供有关问题性质、您的数据库和硬件的更多详细信息。

如果您的数据库大小足够大,选项2将是有益的。从逻辑上讲,在表上运行的选择查询比插入查询要多。

最新更新