SQL Server Int或BigInt数据库表Ids
我在写一个新的程序,它需要一个数据库(SQL Server 2008)。 我现在正在为系统运行的所有东西都是64位的,这引起了我的这个问题。 对于各种表中的所有Id列,我应该将它们全部设置为INT还是BIGINT? 我怀疑这个系统是否会超过INT范围,但是我认为在一些更大的财务表中是可能的。 虽然INT是标准的
好的,让我们做一个快速的math回顾:
-
INT是32位,基本上给你40亿个值 – 如果你只计算大于零的值,它仍然是20亿。 你有这么多员工吗? 顾客? 有库存的产品? 你公司有生之年的订单? 真?
-
BIGINT远远超出了这个范围。 你真的需要吗? 真的 ? 如果你是一个天文学家,或者是粒子物理学 – 也许。 平均业务线用户? 我非常怀疑这一点
想象一下,你有一张桌子,上面有1000万行(贵公司的订单)。 比方说,你有一个Orders表,你创build了一个BIGINT的OrderID被其他5个表引用,并且在你的Orders表的5个非聚集索引中使用 – 没有过度,我想对吧?
1000万行,5个表加上5个非聚集索引,即1亿个实例,其中每个使用8个字节而不是4个字节 – 400万字节= 400 MB。 总的浪费…你需要更多的数据和索引页面,你的SQL Server将不得不从磁盘读取更多页面并caching更多的页面……这对你的性能没有任何帮助 – 简单明了。
PLUS:大多数程序员都没有想到:是的,磁盘空间它很便宜。 但是,浪费的空间在你的SQL Server内存和你的数据库caching中也是相关的 – 而且这个空间并不便宜!
所以要做一个很长的短文:使用真正适合您需要的最小types的INT; 如果你有10-20个不同的值来处理 – 使用TINYINT。 如果您需要订购表,我相信INT应该是足够的 – BIGINT只是浪费空间。
另外:如果你的表格真的接近达到2或40亿行,你仍然有足够的时间将表格升级到BIGINT ID,如果真的需要的话…….
您应该使用对所讨论的表有意义的最小数据types。 这包括使用smallint
甚至tinyint
如果有足够less的行。
您将节省数据和索引的空间,并获得更好的索引性能。 当你所需要的只是一个smallint
时候,使用一个bigint
类似于当你需要的只是一个varchar(50)
时使用一个varchar(4000)
varchar(50)
。
即使机器的本地字大小是64位,这也只意味着64位CPU操作不会比32位操作慢 。 大多数时候,他们也不会更快 ,他们会一样。 但是大多数数据库不会受到CPU的限制,它们将会受到I / O的限制,并且受到较小程度的内存限制,所以当您需要执行一个非常好的事情时,数据量减less50%-90%索引扫描超过2亿行。
这里有一篇关于性能的真实答案的文章…如果可能的话,我更喜欢用硬数字来回答问题…如果你点击下面的链接,至less有一百万条logging,你会发现磁盘使用量上的差异是微不足道的。 ..
http://www.sqlservercentral.com/articles/Performance+Tuning/2753/
就我个人而言,我确实认为使用适当的身份证号码是重要的,但也要考虑一个事实,即你可能有一张桌子,随着时间的推移有很多活动。 这并不是说你存储了大量的数据,而是由于自动递增的性质(删除和插入随着时间的推移)而增加了键值。
考虑社区网站上的文件存储库,或社区网站多租户应用程序上用户注释的ID。
据我所知,大多数开发人员正在构build一个永远不会触及数百万条logging的系统,但需要注意的是,有一些原因需要bigint,我仍然不相信当你devise一个你不知道的模式时如果你觉得潜在的价值超过int的最大价值,那么你不应该试图预测未来,并考虑使用bigint。
32位数字与x86架构或64位与x64架构的alignment称为数据结构alignment
这对数据库中的数据没有任何意义,因为这里是影响性能的磁盘空间,数据caching和表/索引体系结构(如其他答案中所述)。
请记住,这不是CPU访问数据。 数据库引擎代码(可能alignment,但是谁在乎?)在CPU上运行并操纵数据。 当/如果你的数据通过CPU,它肯定不会在相同的磁盘结构。
其他人已经为32位ID提供了令人信服的答案。
对于某些应用程序来说,64位ID确实更有意义。
如果要保证ID在整个数据库集群中是唯一的,那么63位ID可以非常方便。 使用32位,在集群中的服务器之间分配ID的生成是非常困难的; 或跨数据中心。 64位,你有足够的空间玩,你可以方便地生成服务器间的ID不locking,仍然保证唯一性。
例如,请参阅Twitter Snowflake ,以及Instagram Engineering关于“Sharding&IDs at Instagram”的博客文章 。 两者都提供了很好的理由,为什么63位或64位对他们的ID比32位计数器更有意义。
你应该单独判断每个表是哪个数据types能够满足每个表的需要。 如果一个INTEGER满足特定表的需要,那就使用它。 如果一个SMALLINT就足够了,就使用它。 使用将会持续的数据types,不要过多。
第一个答案是没有使用TB大小数据库或者具有常量和大容量插入的表的人的天真答案。 在任何体面的数据库中,在整个生命周期的某个阶段,你会遇到与INT有关的问题。 如果你必须使用BIGINT,它将会进一步节省很多麻烦。 仅仅一年的数据,我就看到企业遇到了廉政问题,而重新种植不是一种select,它造成了大量的停机时间。 同样在长期运行的系统(10年以上)中,系统仍然不能被使用,甚至在中等大小的数据库清除旧数据的情况下也是如此。 在大多数情况下,大多数情况下使用GUID要好得多,如果需要的话,禁止使用BIGINT。