numeric(38,0)作为主键列;好,坏,谁在乎?

时间:2008-11-13 00:12:27

标签: sql sql-server sql-server-2005 primary-key

在我当前的项目中,我遇到了我们的主数据库脚本。仔细看看,我注意到我们所有原始主键的数据类型都是数字(38,0) 我们目前正在运行SQL Server 2005作为我们的主要数据库平台。

对于一些小环境,我们支持Oracle和SQL Server作为后端。在Oracle中,我们的主键的数据类型为 number(38,0)。

是否有人知道此类实施可能产生的副作用和性能影响?我一直主张并实现 int bigint 作为主键,并且很想知道数字(38,0)是否是更好的选择。

4 个答案:

答案 0 :(得分:12)

好吧,你 花费更多的数据来存储你永远无法真正达到的数字。

bigint在8字节中上升至9,223,372,036,854,775,807

int以4字节为单位上升到2,147,483,647

如果我正在进行数学计算,那么NUMERIC(38,0)将会占用17个字节。

没有太大区别,但是:较小的数据类型=内存中的行数较多(或相同行数的页面数较少)=查找的磁盘I / O较少(索引或数据页搜索)。对于复制,日志页面等也是如此。

对于SQL Server:INT是IEEE标准,因此CPU更容易比较,因此使用INT与NUMERIC(这是一种压缩十进制格式)可以略微提高性能。 (注意在Oracle中,如果当前版本与我长大的旧版本匹配,则所有数据类型都被打包,因此INT内部与NUMERIC(x,0)几乎相同,因此没有性能差异)

因此,在宏观方案中 - 如果您有大量磁盘,RAM和备用I / O,请使用您想要的任何数据类型。如果你想获得更多的表现,请保守一点。

否则此时,我会保持原样。无需改变一切。

答案 1 :(得分:3)

除了存储方面的考虑以及未来DBA的一些初步混淆之外,我没有看到任何理由为什么NUMERIC(38,0)会是一个坏主意。您在表格中允许最多9.99 x 10 ^ 38条记录,您肯定无法到达。我对此的快速挖掘并没有发现任何不使用它的明显理由。我怀疑你唯一的潜在问题是它所消耗的存储空间,但看看存储空间是如此便宜,这应该不是问题。

我在Oracle数据库中已经看过很多次,因为它是一个非常大的默认值,在创建表时不需要考虑,类似于在SQL中默认使用INT或BIGINT服务器

答案 2 :(得分:3)

这太大了,因为你永远不会有那么多行。尺寸越大,存储空间越大。这本身并不是什么大问题,但也意味着需要更多的磁盘读取来从表或索引中检索数据。这意味着更少的行将适合数据库服务器上的内存。

我认为它没有被打破到足以让人感到困扰。

答案 3 :(得分:3)

你最好使用GUID。真。不使用一个的正常原因是整数表现更好。但GUID小于数字(38),并且还有一个额外的好处,就是让它更容易做一些让断开连接的用户创建和同步新记录的事情。