-1

我想知道当我想显示计算同一个表中某些字段的结果时,我应该将其作为计算字段还是使用“插入或更新之前”触发器?

注意:我发现了类似的问题,但它是针对 SQL Server 的,我需要知道当我在显示许多记录的网格中显示结果时,计算字段是否会在这种情况下影响性能。

我现在在计算域中使用的计算示例:

field_1 * (
  iif(field_2 is null,0,1)
 +iif(field_3 is null,0,1)
 +iif(field_4 is null,0,1)
 +iif(field_5 is null,0,1))
4

2 回答 2

3

仅当您将信息存储在表中时,触发器才有效,因为它们仅在实际INSERT,UPDATEDELETE发生时才被触发。它们对SELECT语句没有影响。因此,实际问题变成了“我应该在我的SELECT语句中计算列值,还是添加一个列来存储它们?”。

无需在 中存储可以轻松计算的值SELECT,并且在执行像您在此处包含的简单计算时很少会影响性能。

是否应该存储它取决于许多因素,例如数据更改的频率,以及典型查询的结果集有多大。您返回的行越多,计算的影响就越大,并且在某些时候,计算过程变得比添加列所产生的存储需求增加的成本更高。但是,如果您可以限制查询返回的行数,则计算成本可以忽略不计,以至于在不需要时为每行维护额外数据列的开销可能会更高,因为插入的每一行即使未访问该数据,或更新也会执行触发器。

但是,如果您的典型查询返回大量行或计算非常复杂,则计算可能会变得非常昂贵,因此最好将数据存储在可以快速轻松地检索数据的实际列中。但是,如果频繁插入或更新数据,触发器的执行会减慢这些操作的速度,并且如果它们发生的频率比大型查询高得多,SELECT则可能不值得进行权衡。

将计算结果实际存储在列中至少有一个缺点(我没有提到,但你在下面的评论中问过)。如果你的计算(公式)逻辑发生变化,你必须:

  • 禁用触发器
  • 根据新计算使用新值更新所有行
  • 编辑触发器以使用新计算
  • 重新启用触发器

在查询本身完成计算后,您只需更改查询的 SQL 即可。

所以我的回答是

  • 除非您有明确的理由不这样做,否则最好动态计算列值,并且
  • “这样做的明确理由”意味着您可以证明与计算相关的实际性能影响,或者您需要SELECT非常大量的行进行相当密集的计算。
于 2013-05-24T21:52:29.067 回答
1

性能应该很好,除非当您的计算字段成为 WHERE 子句的一部分时使用更大的表。另一件事是,即使由其他字段计算,如果您的要求允许出于某种原因覆盖计算值。那么你也需要一个真实的物理场。

于 2013-05-24T16:08:51.903 回答