0

例如,我有一个CALCULATE包含字段val1val2、的表val3

现在,我有两种存储/检索数据的选项:

  1. 添加列 addition multiplicationdivision并将计算的数据保存在INSERT

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

另外,对于选项 1,使用过程或触发器会更有效吗?

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

4

2 回答 2

1

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

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

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

  1. 每行只进行一次计算。因此,如果您多次检索它们,您将获得节省。
  2. 您可以索引计算的列(在任何数据库中),从而提高查询效率。
  3. 如果您的查询是“大海捞针”查询(也就是说,它们一次只获取几行),那么对性能没有影响。

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

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

于 2013-05-29T20:41:12.573 回答
0

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

于 2013-05-29T20:37:18.223 回答