小编典典

SQL Server BIGINT或DECIMAL(18,0)作为主键

sql

我们有一个SQL Server
2005数据库,我们要为其提高批量删除/插入/选择的性能,我注意到它decimal(18,0)用于其主键。我知道,这将给我们带来比bigint以前更多的价值,但我希望这将是一次快速的胜利,并且根据我的测算应该能够使我们持续数百万年的增长。

我在.net docs中看到小数点占用了16个字节,而不是long所需的8个字节,但是在SQL
Server中,它看起来像是bigint 占用了8个字节,decimal(18,0)仅占用了5个字节-也见过select DATALENGTH(max(id)) from table。这样对吗?

还有其他原因bigint可能会变慢或我应该坚持decimal(18,0)吗?


阅读 472

收藏
2021-03-17

共1个答案

小编典典

在计数字节之前,DATALENGTH正在强制转换为varchar。因此,您的最大值是<100000。

可以证明这9个字节。sys.columns有一个max_length列(十进制是固定长度,因此始终为9个字节,除非您另行询问)

CREATE TABLE dbo.foo (bar decimal(18,0))
GO
SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('foo') 
GO
DROP TABLE dbo.foo
GO

由于遗留原因,decimal(18, 0)在bigint与SQL Server 2000一起添加之前,通常用作“64位整数”的替代。

decimal(18, 0)bigint范围大致相同: 根据文档, 十进制为9字节 多了一个字节 __

最重要的是,纯整数将比小数更快地小数(可能无法测量)。话虽这么说,如果预计明年或第5行将有40亿行,那么性能应该很重要。如果不是,那就用int

2021-03-17