仅当您将信息存储在表中时,触发器才有效,因为它们仅在实际INSERT
,UPDATE
或DELETE
发生时才被触发。它们对SELECT
语句没有影响。因此,实际问题变成了“我应该在我的SELECT
语句中计算列值,还是添加一个列来存储它们?”。
无需在 中存储可以轻松计算的值SELECT
,并且在执行像您在此处包含的简单计算时很少会影响性能。
是否应该存储它取决于许多因素,例如数据更改的频率,以及典型查询的结果集有多大。您返回的行越多,计算的影响就越大,并且在某些时候,计算过程变得比添加列所产生的存储需求增加的成本更高。但是,如果您可以限制查询返回的行数,则计算成本可以忽略不计,以至于在不需要时为每行维护额外数据列的开销可能会更高,因为插入的每一行即使未访问该数据,或更新也会执行触发器。
但是,如果您的典型查询返回大量行或计算非常复杂,则计算可能会变得非常昂贵,因此最好将数据存储在可以快速轻松地检索数据的实际列中。但是,如果频繁插入或更新数据,触发器的执行会减慢这些操作的速度,并且如果它们发生的频率比大型查询高得多,SELECT
则可能不值得进行权衡。
将计算结果实际存储在列中至少有一个缺点(我没有提到,但你在下面的评论中问过)。如果你的计算(公式)逻辑发生变化,你必须:
- 禁用触发器
- 根据新计算使用新值更新所有行
- 编辑触发器以使用新计算
- 重新启用触发器
在查询本身完成计算后,您只需更改查询的 SQL 即可。
所以我的回答是
- 除非您有明确的理由不这样做,否则最好动态计算列值,并且
- “这样做的明确理由”意味着您可以证明与计算相关的实际性能影响,或者您需要
SELECT
非常大量的行进行相当密集的计算。