数据完整性是最重要的。
在视图中计算结果可以保证为您提供最新的答案。权衡是 SELECT 语句的运行时性能,尤其是在 WHERE 子句中使用结果时。根据我的经验,计算结果很少用于 WHERE 子句。计算,我的意思不仅是算术,还包括字符串和子字符串的提取和连接、校验和计算等。
将计算结果存储在基表中可为您提供最佳 SELECT 性能。权衡是数据完整性。如果您可以编写保证结果始终正确的 CHECK() 约束,那么您应该这样做。但是,如果不使用用户定义的函数,有时无法表达复杂计算的 CHECK() 约束,而且并非所有平台都支持 CHECK() 约束中的用户定义函数。
如果您不能编写 CHECK() 约束,您仍然需要某种程序来定期检查您的数据是否有错误。在最坏的情况下,您可以在需求量低时每天或每周运行报告。
物化视图可能会为您提供两全其美的优势 - 可以作为 sargable WHERE 子句目标的计算,并且始终保证是正确的。(SQL Server 等价物称为索引视图。)权衡是存储空间和 CPU 周期,以使物化视图及其索引在基表更新后保持最新。
通常,我会先尝试一个视图。但在您的特定情况下——每天 40 万行,持续 365 天——我想我会先尝试物化视图。无论出于何种原因,它都无法正常工作,您可以将其替换为基表中的列,删除物化视图,然后创建一个具有相同名称的新视图。(逻辑数据独立性摇滚。)