我有一个高性能数据库(在SQL Server 2012上)。我的一个视图有一个虚拟列,由前一列值的内联标量值UDF计算自定义哈希表示。我将此计算从视图移动到其中一个基础表中以提高性能。我在表中添加了一个新的计算列并保留了数据。然后,在此列上创建索引并在相应的视图中将其引用回来(基本上将逻辑从视图迁移到表中)。
现在我想知道为什么我不会在表中添加常规VARCHAR(32)列而不是计算的PERSISTED列?我可以使用上面提到的所有新插入的UDF在此列上创建DEFAULT并重新计算历史记录。
带有PERSISTED数据的索引计算列与常规NC索引列有什么优势?
THX。
答案 0 :(得分:3)
如果基于的字段数据发生更改,计算列将使您的字段保持最新。如果没有为该字段提供任何值,则仅添加默认值将更新插入字段。
如果您知道您的数据不会改变(我认为您暗示但未在您的问题中指明),那么它们在功能上与您相同。计算列可能是首选,但是为了防止使用不正确的值意外更新字段(绕过默认值)。此外,任何其他开发人员都清楚该字段的用途。
答案 1 :(得分:2)
您可以使用默认值切换到“普通”列或插入触发器。一个潜在的问题是,与计算列不同,任何具有插入/更新访问权限的人都可能(可能意外地)更改列的值。
无论哪种方式,性能都是一样的。从本质上讲,这就是db在持久计算列的幕后所做的事情。作为开发人员,持久计算的列在intent中比默认值更清晰。默认值意味着它是许多可能值中的一个,而不是唯一可能的值。
请务必使用SchemaBinding声明UDF。这将允许SQL Server确定该函数是否是确定性的并将其标记为如此。在某些情况下,这可以改善查询计划优化。
答案 2 :(得分:0)
没有性能差异。但是,就数据库设计而言,如果在持久化视图中包含预先计算的列,则会更加优雅。