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

vst*_*ien 14 sql-server datatypes t-sql

我们的一位客户将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 范围内的整数(不到INT4 个字节提供的范围的一半)。

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

  • 能够在不使用更多存储空间的情况下增加规模
  • 能够将精度扩展到 38 位,而无需更改数据类型

但在我看来,这些并不是真正的好处:

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

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

Chr*_*ubb 7

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

在处理方面,就像@Andriy 所说的 DECIMAL 自然会分成一种不会丢失小数部分的类型,如果这对您很重要。

在另一方面,与本地INT类型的工作是快从数字的角度来看,如果你做了很多的SUM()S或比较(如搜索上的值),因为它们是由CPU更有效的流水线。int 比较是两个汇编操作码(MOV、CMP),但任何十进制比较将很多很多。

  • 我以为我可以,但我承认我的测试是不确定的。也许 SQL 正在做优化以将问题简化为整数数学。我的测试平台:` --Int 比较 SET @StartTime = SYSDATETIME() WHILE (@CounterINT < @SizeINT) SET @CounterINT = @CounterINT + 1 PRINT 'INT take ' + CONVERT(VARCHAR(20), DATEDIFF(millisecond, @StartTime) , SYSDATETIME())) + 'milliseconds' --Decimal SET @StartTime = SYSDATETIME() WHILE (@CounterDEC < @SizeDEC) SET @CounterDEC = @CounterDEC + 1 PRINT 'DEC take ' + CONVERT(VARCHAR(20), DATEDIFF (毫秒,@StartTime,SYSDATETIME())) + '毫秒'` (2认同)