【发布时间】:2021-12-08 16:03:34
【问题描述】:
我有一个包含以下列的表格
Id - Int Primary key Identity column
Name - Varchar(100)
OrderValue - int
OrderDate - date
OrderState - varchar(100)
列 (Name, orderValue) 具有唯一键约束和唯一的非聚集索引。
我们有一个新要求,OrderValue 列将开始接收字符串、浮点数、guid。我们现在有两个选项是将 orderValue 的数据类型更改为 Varchar(100) 或 SQL_Variant。我的队友支持 sql_variant。他们的理由是,由于 orderValue 是唯一非聚集索引的一部分,因此更改它 sql_variant 将使索引表中的索引键的排序变得容易,因为相同类型的所有数据类型都存储在一起。我不太熟悉 Sql_variant 以及如何为 sql_variants 存储索引,但我读过 sql_variant 的性能通常很差。在我们的例子中,什么是一个好的选择?当非聚集索引具有其中一列作为 sql_variant 时,它们如何工作?
【问题讨论】:
-
我可能会保留 OrderValue 原样并添加/使用新的/不同的字段来存储字符串变体作为参考。
-
SQL 是强类型的,仅仅因为你可以,并不意味着你应该。一个变体可以被索引,但大小是有限的(900b),超过这个值并且插入会出错。我会为每种特定的数据类型添加列。
-
感谢大家的回复。我们预计任何时候都不会超过 900b,我们希望所有值都在 Ordervalue 中。我们无法为每种数据类型创建新列,因为我们预计未来会有更多的数据类型。从性能的角度来看,将此列转换为 sql_variant 或 varchar 是否有意义?
-
可能还有多少数据类型? EAV 远没有 sql_variant 恕我直言邪恶。 sqlblog.org/2009/11/19/what-is-so-bad-about-eav-anyway
标签: sql sql-server tsql ssis msbi