我正在编写一个新程序,它将需要一个数据库(SQL Server 2008)。目前系统中的所有内容都是64位的,这就带来了一个问题。对于各种表中的所有Id列,我应该将它们全部设置为INT还是BIGINT?我怀疑系统将永远不会超过INT范围,但在某些更大的财务表中可能存在这种可能性。尽管如此,INT似乎是标准...
我正在编写一个新程序,它将需要一个数据库(SQL Server 2008)。目前系统中的所有内容都是64位的,这就带来了一个问题。对于各种表中的所有Id列,我应该将它们全部设置为INT还是BIGINT?我怀疑系统将永远不会超过INT范围,但在某些更大的财务表中可能存在这种可能性。尽管如此,INT似乎是标准...
好的,让我们快速回顾一下数学:
INT 是32位的,可以给你大约40亿个值 - 如果你只计算大于零的值,那就是20亿。你有这么多员工吗?客户?库存产品?公司的生命周期中的订单数量?真的吗?
BIGINT 超出了这个范围。你真的需要它吗?如果你是天文学家或者研究粒子物理学,也许需要。但普通的商业用户,我强烈怀疑。
想象一下你有一个有1000万行记录的表(你公司的订单)。比如说你有一个 Orders 表,其中 OrderID 使用 BIGINT 类型,并且被其他5个表所引用,在 Orders 表上还有5个非聚集索引 - 我觉得这并不过分,对吧?
1000万行,乘以 5 个表再加上 5 个非聚集索引,这使得你使用的是每条记录8字节而不是4字节 - 400百万字节 = 400 MB。完全浪费......你会需要更多的数据和索引页面,你的SQL Server将不得不从磁盘读取更多页面并缓存更多页面......这对你的性能没有好处 - 简单明了。
此外,大多数程序员不会想到的是:是的,磁盘空间很便宜。但是那些浪费的空间也会影响到SQL Server的RAM内存和数据库缓存 - 而那部分空间可不便宜!
因此,为了让长篇大论变得简短,使用最小化的 INT 类型来满足你真正需要的需求;如果你需要处理10-20个不同的值 - 使用 TINYINT。如果你需要一个订单表,我相信 INT 应该完全够用了 - BIGINT 只会浪费空间。
另外:如果你的任何一个表真的接近于达到20或40亿行,那么你仍然有足够的时间将你的表升级为 BIGINT ID,如果真的需要的话.......
以下是关于性能的真实解答文章...如果可能的话,我更愿意用硬数据回答问题...如果您点击以下链接至少达到一百万条记录,您会发现磁盘使用差异微不足道...
http://www.sqlservercentral.com/articles/Performance+Tuning/2753/
个人认为使用适当的 ID 大小很重要,但同时也要考虑到您可能有表格随时间而产生大量活动。这并不是存储大量数据,而是由于自动增加(删除和插入在此期间发生)而导致键值增长的性质。
考虑到一个社区网站上的文件库,或多租户应用程序上的用户评论 ID。
我知道大多数开发者正在构建永远不会触及数百万条记录的系统,但重要的是要注意,存在需要 bigint 的原因,并且我仍然不相信当您设计一个模式时,您不知道该模式可能增长到何种程度时,您不应该试图预测未来并考虑使用 bigint 如果您认为存在超过 int 的最大值的潜力作为 ID 值增长的情况。
应该使用对于相关表而言有意义的最小数据类型。这包括在行数较少时甚至可以使用smallint
或tinyint
。
这样可以节省数据和索引空间,并获得更好的索引性能。当需要的只是smallint
时,使用bigint
类似于使用varchar(4000)
而实际上只需要varchar(50)
。
即使机器的本机字长为64位,这只意味着64位CPU操作不会比32位操作任何慢。大多数情况下,它们也不会更快,它们将是相同的。但是,大多数数据库不太可能受到CPU限制,它们将受到I/O限制和较小程度上的内存限制,因此当需要在2亿行上执行索引扫描时,50%-90%更小的数据大小是一个非常好的事情。
char(10)
和 char(50)
。 - Aaronaught32位数字在x86架构或64位数字在x64架构中的对齐称为数据结构对齐。
这对于数据库中的数据没有意义,因为磁盘空间、数据缓存和表/索引结构等因素会影响性能(如其他答案所述)。
请记住,CPU并不是直接访问数据。运行在CPU上并操作您的数据的是DB引擎代码(可能会进行对齐,但谁在乎呢?)。如果您的数据通过CPU,则它肯定不会在相同的磁盘结构中。
您应该根据每个表格的需求单独判断使用哪种数据类型。如果一个整数可以满足特定表格的需要,那么就使用它。如果小整数就足够了,那么就使用它。使用持久的数据类型,而不是过度的数据类型。
BIGINT
身份标识符,这对 AT&T 只有大约 300 万个月的有效期。 - marc_sint
不足以满足需求。不确定为什么你要对此嘲讽。如果你对这个例子有疑虑,或者认为对于手机元数据来说int
已经足够,请告诉我。我一直在努力做得更好。 - user38858INT
只能提供大约 21 亿个值。INT UNSIGNED
可以提供大约 42 亿个值。(除非负 ID 是可以接受的...这是非常不寻常的) - hanshenrik