在 SQL Server 2005 中,我们在特别是 SK(代理键)上定义了一些 UDT(用户定义数据类型)。这些被定义为 32 位“int”。因此大小为 4 个字节。

在 SQL Server 2008 中,整数数据类型的 UDT 使用不同的存储机制,具体取决于精度:

贮存
显示 UDT 的最大存储大小。最大存储大小因精度而异。

精度(位数).....存储(字节)

1 – 9 .....................5

10 – 19 .....................9

20 – 28 .....................13

29 – 38 .....................17

这样做的一个后果是基于 BOTH int 和 bigint 的 UDT 将占用 9 个字节!
注意:原生 int 和 bigint 数据类型仍然分别占用 4 和 8 个字节!

对于代理键 UDT 来说,9 个字节似乎非常重要!

谁能解释为什么会这样(特别是这样做的设计原理是什么)? UDT 和 native 数据类型之间的差异是如何产生的?

除了不使用 UDT 之外,还有其他替代方法吗?

最佳答案

对不起,但在我看来你弄错了。请记住,“SELECT 没有损坏”并且由于转换问题,Microsoft 不会在没有强烈宣传的情况下修改他们引擎的如此关键部分。

您引用的表来自 十进制 数字 存储在 MSDN ,它们基本上比 int

如果您使用严格的别名,Using special datatypes 强烈暗示基于 int 的类型需要四个字节,仅此而已。
如果您使用的是 CLR 类型,则会出现龙或更多开销。

无论如何,您可以通过查看 sys.types 来验证数据类型的占用空间

关于SQL Server UDT 大小 2005 到 2008,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/641244/

10-11 09:33