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

use*_*179 11 sql sql-server sql-server-2005 primary-key

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

对于一些上下文,我们支持Oracle和SQL Server作为后端.在Oracle中,我们的主键具有数字类型(38,0).

有人知道这种实施可能产生的副作用和性能影响吗?我一直倡导并实现intbigint作为主键,并且很想知道数字(38,0)是否是更好的选择.

Mat*_*ish 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,请使用您想要的任何数据类型.如果你想获得更多的表现,请保守一点.

否则在这一点上,我会保持原样.无需改变事物.


WW.*_*WW. 5

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

我认为它还没有损坏到需要费心去修理的程度。

  • @Rick - 即使 SO 每天获得 1000 万次点击,BIGINT 溢出也需要 25 亿年。 (4认同)