【问题标题】:SQL Server UDT sizes 2005 to 2008SQL Server UDT 大小 2005 到 2008
【发布时间】:2010-10-13 01:52:32
【问题描述】:

在 SQL Server 2005 中,我们定义了一些 UDT(用户定义的数据类型),特别是 SK(代理键)。这些被定义为 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 个字节!

9 字节对于代理键 UDT 来说似乎相当重量级!

谁能解释为什么会这样(特别是设计原理是什么)? UDT 和本机数据类型之间为什么会出现这种差异?

除了不使用 UDT,还有其他方法吗?

【问题讨论】:

    标签: sql sql-server sql-server-2008 user-defined-types


    【解决方案1】:

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

    你引用的表格来自MSDN中的decimalnumeric存储,基本上超过int

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

    无论如何,您可以通过查看 sys.types 来验证您的数据类型的足迹

    【讨论】:

    • 嗨,约翰,谢谢。我明白你提出的观点。但问题是当我进入“新用户定义的数据类型”并基于 int 创建 UDT 时,精度显示为 10,存储显示为 9 个字节 - 而不是 sys.types 建议的 4 个字节。有什么相关的吗?
    • 嗨,Johan,进一步的研究表明这是一个 UI 错误。在 sys.types 中分配的实际存储量是 int 的 4 个字节。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2011-04-29
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多