SQL Server十进制(9,0)与INT


15

我们的一位客户使用DECIMAL(18,0)他的SQL Server 2008R2数据库中的数据类型作为某些列。由于列的增长非常缓慢,因此他最近提议更改数据类型DECIMAL(5,0)以重新获得一些存储空间。

根据MSDN库,与DECIMAL(5,0)数据类型一样,DECIMAL(9,0)数据类型的存储空间为5个字节。INT是小1个字节,但可以存储-2 ^ 31到2 ^ 31范围内的所有内容,而不是DECIMAL(5,0)可以存储的-99,999到99,999 。即使是最大的DECIMAL5个字节(DECIMAL(9,0)),也只能存储-999,999,999到999,999,999(小于范围的一半)范围内的整数INT 4字节)。

我可以想到使用DECIMALover 的两个“好处” INT

  • 之后可以增加规模,而无需使用更多的存储空间
  • 可以将精度扩展到38位,而无需更改数据类型

但是我认为这些并不是真正的好处:

  • 将比例添加到整数仅在极少数情况下才有意义(在大多数情况下比例确实有所不同,也可以预先添加)
  • SQL Server将每个精度/小数位组合视为不同的数据类型,因此在提高精度或小数位时,不会单独保留数据类型。

这让我想知道:DECIMAL(5,0)整数数据类型的附加好处是什么?


1
一种好处是五位数的限制。但是我想知道通过这样的更改您可以节省多少存储空间。
dezso 2012年

3
IMO,如果只需要确保列值落在一个范围内,请使用检查约束。我认为,这里唯一需要考虑的是,将来是否有可能该列需要小数。
乔恩·塞格尔

3
如果他们担心存储空间,则比使用压缩更适合。使用十进制(x,0)代替int / bigint没有明显的好处。
罗伯特·L·戴维斯

7
decimal(x,0)和整数类型之间的另一个区别在于算术除法本身。如果将一个整数除以一个整数,则会得到一个整数。如果将小数(x,0)除以整数,则将得到小数(x + 6,6)。
Andriy M

@AndriyM,我认为这是最大的好处。将其改写为答案而不是评论,我将其标记为答案。
vstrien 2013年

Answers:


8

我同意在存储方面没有真正的好处只要您将DECIMAL(9,0)与INT或DECIMAL(18,0)与BIGINT进行比较空间。(在一个字节内。)

在处理方面,例如@Andriy说,DECIMAL会自然地划分为不会丢失小数部分的类型,如果那对您很重要的话。

另一方面,如果要执行大量的SUM()或比较(例如搜索值),则从数字角度来看,使用本机INT类型快得多,因为它们会被CPU更有效地进行流水线处理。一个int比较是两个汇编操作码(MOV,CMP),但是任何十进制比较都会很多很多。


您的答案很有意义,但是处理器对数据类型一无所知。因此,比较一个4字节的数据类型与另一个4字节的数据类型一样快。您能否证明(例如,通过可重复的性能测试)使用DECIMAL(9, 0)而不是使用会带来性能方面的损失INT
vstrien 2013年

2
我以为可以,但是我会承认我的测试尚无定论。也许SQL正在进行优化以将问题简化为整数数学。我的测试平台:`--Int比较SET @StartTime = SYSDATETIME()时(@CounterINT <@SizeINT)SET @CounterINT = @CounterINT + 1 PRINT'INT接受'+ CONVERT(VARCHAR(20),DATEDIFF(毫秒,@StartTime ,SYSDATETIME()))+'毫秒'-十进制SET @StartTime = SYSDATETIME()WHILE(@CounterDEC <@SizeDEC)SET @CounterDEC = @CounterDEC + 1 PRINT'DEC带'+ CONVERT(VARCHAR(20),DATEDIFF (毫秒,@ StartTime,SYSDATETIME()))+'毫秒'
克里斯·丘布

我认为SQL Server确实可以优化某些内容。尽管优化DECIMAL仍然需要花费更长的时间(至少在我的开发系统上)。在大约51 ms的DEC与46 ms的INT之间进行了10次测试。
vstrien 2013年

2

在存储空间方面似乎没有任何好处

如果客户担心您的值将大于2 ^ 32-1(可以存储的最大正值整数),则应考虑使用BigInt -64位(8字节)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.