【问题标题】:Is there any reason for numeric rather than int in T-SQL?在 T-SQL 中,数字而不是 int 有什么理由吗?
【发布时间】:2010-10-01 05:53:01
【问题描述】:

为什么有人会对简单的整数 ID 列使用 numeric(12, 0) 数据类型?如果您有理由说明这比 int 或 bigint 更好,我想听听。

我们没有对此列进行任何数学运算,它只是一个用于外键链接的 ID。

我正在编制一份关于产品的编程错误和性能问题的列表,并且我想确保他们没有出于某种合乎逻辑的原因这样做。如果您点击此链接: http://msdn.microsoft.com/en-us/library/ms187746.aspx

...您可以看到 numeric(12, 0) 使用 9 个字节的存储空间并且限制为 12 位,如果包括负数,则总共有 2 万亿个数字。当一个人可以使用 bigint 并获得 1000 万倍的数字而少一个字节的存储空间时,为什么还要使用它。此外,由于这是用作产品 ID,因此标准 int 的 40 亿个数字已经足够了。

所以在我拿起火炬和音叉之前 - 告诉我他们会说些什么来为他们辩护?

不,我并不是无中生有,软件中有数百个类似的问题,这一切都会导致巨大的性能问题并在数据库中占用过多的空间。我们为这种垃圾支付了超过一百万美元……所以我很认真地对待它。

【问题讨论】:

    标签: sql database oracle tsql types


    【解决方案1】:

    在您的示例中,我想不出您不使用 INT 的任何合乎逻辑的原因。我知道数字的其他用途可能是有原因的,但在这种情况下不是。

    【讨论】:

      【解决方案2】:

      根据:http://doc.ddart.net/mssql/sql70/da-db_1.htm

      十进制

      从 -10^38 -1 到 10^38 -1 的固定精度和刻度数值数据。

      数字

      十进制的同义词。

      int

      从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整数(整数)数据。

      不可能知道他们是否有理由使用十进制,因为我们没有代码可以查看。

      【讨论】:

      • 奇怪的是,当它们被允许为负时,将整数称为“整数”。
      • 负数是整数 - 它们没有小数部分。根据大多数定义,它们不是“计数数字”,但它们是完整的。
      • 许多作者使用术语整数来表示自然数,即:非负整数 (0, 1, 2, 3, ...) 正整数 (1, 2 , 3, ...)
      【解决方案3】:

      使用数字的原因有很多 - 例如 - 财务数据和其他需要精确到某些小数位的内容。但是,对于您上面引用的示例,一个简单的 int 就可以了。

      也许是不知道如何设计数据库的马虎程序员?

      【讨论】:

        【解决方案4】:

        在某些数据库中,使用小数(10,0) 会创建占用较少空间的压缩字段。我知道我的工作周围有很多桌子都在使用它。他们可能在这里有同样的想法,但是您已经查看了文档并证明这是不正确的。很有可能,我会说它会归结为“这是我们一直这样做的方式,因为有人曾经说过它更好”。

        【讨论】:

          【解决方案5】:

          在您太认真之前,该项目的每行或每行集的数据存储要求是什么?

          您的观察是正确的,但是如果您将存储空间从 5000 字节减少到 4090 字节,您可能不想过于强烈地呈现它。

          您不想通过提出这一点并让他们指出任何可衡量的节省都是微不足道的,从而破坏您的信誉。 (“当然,我们许多经验不足的员工也犯了同样的错误。”)

          你能填这些空格吗?

          with the data type change, we use
              ____ bytes of disk space instead of ____
              ____ ms per query instead of ____
              ____ network bandwidth instead of ____
              ____ network latency instead of ____
          

          这样的事情会给你带来可信度。

          【讨论】:

          • 由于此 ID 代码被复制到许多表中,在 API 查询中使用,并用于连接,这不仅仅是每行保存一个字节的问题 - 这是在索引中保存数据的问题、优化连接、减少网络开销等......
          • 没错。量化它,你就会有一个强有力的理由来支持你的决定。我提出的反对意见只是您可能听到的反对意见的例子,应该准备好回答。
          【解决方案6】:

          他们可能会在 MS Access 中花费大量时间并经常看到“数字”并且只是想出来,它是一个数字,为​​什么不使用数字?

          根据您的发现,他们听起来不像是优化专家,只是不知道而已。我想知道他们是否使用了模式生成工具并且过于依赖它们。

          我想知道与纯整数值相比,主键的十进制值索引(即使设置了 0 刻度)的效率如何。

          就像 Mark H. 所说,除了索引因素之外,这种特殊情况可能不会使数据库增长太多,但是如果您正在寻找弹药,我认为您确实找到了一些可以贬低它们的东西。

          【讨论】:

          • 我有很多错误要指出——我敢肯定。这件事令人惊讶,它是那些“一定有这个原因”的事情之一。 IE。太奇怪了,一定是故意的。
          【解决方案7】:

          您正在研究的这个应用程序有多长时间了?

          在 SQL Server 2000 之前没有 bigint。也许它只是让它从一个版本到另一个版本多年而没有被更改的东西,或者数据库架构是从一个这么旧的应用程序中复制而来的?!?

          【讨论】:

          • 它是自 SQL 2000 以来的新产品。但是,数据库可能基于一些较旧的设计 - 但这意味着他们向我们出售的东西不是他们所说的那样。
          【解决方案8】:

          也许他们习惯于使用 Oracle?

          包括整数在内的所有数字类型都被标准化为所有平台之间的标准单一表示。

          【讨论】:

          • 轰轰烈烈 :) 显然这个数据库的旧版本是 Oracle。
          【解决方案9】:

          在您的引文中,小数点显示 1-9 的精度为使用 5 个字节。您的列显然有 12,0 - 使用 4 个字节的存储空间 - 与整数相同。

          此外,INT,数据类型可以达到 31 的幂: -2^31 (-2,147,483,648) 到 2^31-1 (2,147,483,647)

          虽然小数比 38 大得多: - 10^38 +1 到 10^38 - 1

          因此,软件创建者实际上在使用相同数量的存储空间时提供了更多。

          现在,在排除了基础知识之后,软件创建者实际上将自己限制为 12 个数字或 123,456,789,012(只是占位符的示例,不是最大数字)。如果他们使用 INT,他们将无法缩放此列 - 它将上升到完整的 31 位数字。也许出于商业原因将此列和相关列限制为 12 位。

          INT 是 INT,而 DECIMAL 是标量。

          希望这会有所帮助。

          PS: 整数参数是: A) 整数是 0..infinity B) 计数(自然)数是 1..infinity C)整数是无穷大(负)..无穷大(正) D) 我不会为任何事情引用 WikiANYTHING。来吧,使用真实的来源!也可以http://MyPersonalMathCite.com

          【讨论】:

          • ?根据 t-sql 上的 Microsoft 文档(原始海报提供的链接),12,0 精度需要 9 个字节,而不是 4 个。
          猜你喜欢
          • 2014-06-06
          • 2019-02-20
          • 2015-08-25
          • 2017-04-22
          • 1970-01-01
          • 2010-11-10
          • 2021-07-25
          • 2015-10-04
          • 2010-10-10
          相关资源
          最近更新 更多