我们有一个SQL Server 2005数据库,我们要为其提高批量删除/插入/选择的性能,我注意到它decimal(18,0)用于其主键。我知道,这将给我们带来比bigint以前更多的价值,但我希望这将是一次快速的胜利,并且根据我的测算应该能够使我们持续数百万年的增长。
decimal(18,0)
bigint
我在.net docs中看到小数点占用了16个字节,而不是long所需的8个字节,但是在SQL Server中,它看起来像是bigint 占用了8个字节,但decimal(18,0)仅占用了5个字节-也见过select DATALENGTH(max(id)) from table。这样对吗?
select DATALENGTH(max(id)) from table
还有其他原因bigint可能会变慢或我应该坚持decimal(18,0)吗?
在计数字节之前,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)
decimal(18, 0)且bigint范围大致相同: 根据文档, 十进制为9字节 , 多了一个字节 __
最重要的是,纯整数将比小数更快地小数(可能无法测量)。话虽这么说,如果预计明年或第5行将有40亿行,那么性能应该很重要。如果不是,那就用int
int