T-SQL中有数字而不是int的原因吗?

时间:2009-01-13 21:01:02

标签: sql database oracle tsql types

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

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

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

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

所以在我拿起火把和叉子之前 - 告诉我他们在辩护中会说些什么?

不,我没有做出大笔交易,软件中存在数百个这样的问题,而且这些都会导致巨大的性能问题并且在数据库中占用太多空间。我们为这个垃圾支付了超过一百万美元...所以我认真对待它。

9 个答案:

答案 0 :(得分:14)

也许他们已经习惯了与Oracle合作?

所有数字类型(包括整数)都标准化为所有平台中的标准单一表示形式。

答案 1 :(得分:6)

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

也许草率的程序员工作谁不知道如何设计数据库?

答案 2 :(得分:3)

您正在研究这个应用程序的年龄?

在SQL Server 2000之前没有bigint。也许它只是让它从发布到发布多年没有被更改或数据库模式从这个旧的应用程序中复制出来的东西?!

答案 3 :(得分:1)

在您的示例中,我无法想到您不使用INT的任何逻辑原因。我知道可能有其他数字使用的原因,但在这种情况下不会。

答案 4 :(得分:1)

在您认真对待之前,此项目的每行或每组行的数据存储要求是什么?

您的观察结果是正确的,但是如果您将存储空间从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 ____

这就是让你有信誉的事情。

答案 5 :(得分:0)

根据: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)。

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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

我想知道主键的十进制值索引(即使设置为0比例)与纯整数值的效率有多高。

像Mark H.所说的那样,除了索引因素之外,这个特殊情况可能并没有增加数据库的数量,但是如果你正在寻找弹药,我认为你确实找到了一些贬低它们。

答案 8 :(得分:0)

在您的引文中,十进制显示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..nfinity C)整数是无穷大(负)..无穷大(正) D)我不会引用维基百科的任何内容。来吧,使用真正的来源!也可以是http://MyPersonalMathCite.com