2009-01-13 23 views
11

为什么有人会使用数字(12,0)数据类型作为简单的整数ID列?如果你有一个理由为什么这比int或bigint更好,我想听听它。在T-SQL中是否有任何数字而不是int的原因?

我们没有对这一列做任何数学计算,它只是一个用于外键链接的ID。

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

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

因此,在我抓住火把和球叉之前 - 告诉我他们在防守时会说些什么?

不,我没有做任何事情,软件中有数百个这样的问题,这都会导致巨大的性能问题,并在数据库中使用太多空间。我们为这种垃圾支付了一百多万美元......所以我认真对待它。

回答

13

也许他们习惯与Oracle合作?

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

1

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

-1

据: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

奇怪的是,当它们被允许为负数时,整数表示整数。 – recursive 2009-01-13 21:15:41

+0

负数是整数 - 它们没有小数部分。他们不是按照大多数定义来“计算数字”,但它们是完整的。 – Jasmine 2009-01-13 21:24:54

+0

http://en.wikipedia.org/wiki/Whole_number – GEOCHET 2009-01-13 21:46:59

6

有很多原因使用数字 - 例如 - 财务数据和其他东西,需要准确到某些小数位。然而,对于上面引用的例子,一个简单的int就可以完成。

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

0

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

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 ____ 

这是一种会给你信誉的东西。

+1

由于此ID代码复制到许多表中,用于API查询并用于连接,因此它不仅仅是每行保存一个字节的问题 - 这是在索引中保存数据,优化连接,减少网络开销等问题。 – Jasmine 2009-01-13 21:23:13

0

这是可能的,他们花了很多时间在MS Access和经常看到'数字',只是想通,它的数字,为什么不使用数字?

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

我想知道一个主键与一个纯整数值相比,对一个十进制值的索引(即使设置了0的比例)有多高效。

像马克·H说的,除了索引因素之外,这个特定的场景可能不会增加数据库那么多,但是如果你正在寻找弹药,我认为你确实找到了一些可以贬低它们的东西。

3

您正在查看的这个应用程序的年龄?

在SQL Server 2000之前没有bigint。也许它只是从发布到发布多年而没有改变,或者数据库模式是从一​​个旧的应用程序中复制出来的!

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..infinity C)整数被无穷大(负)..无穷大(正) D)我不会引用维护任何东西。来吧,使用真正的来源!也可能是http://MyPersonalMathCite.com

相关问题