Performance 为什么使用SMALLINT代替DECIMAL时求和更快

Performance 为什么使用SMALLINT代替DECIMAL时求和更快,performance,tsql,sql-server-2012,aggregate-functions,sql-types,Performance,Tsql,Sql Server 2012,Aggregate Functions,Sql Types,是否有任何已知规则表明某些T-SQL类型更适合于计算 我有两个相同的表,其中包含数字-一个带有SMALLINT字段,另一个带有DECIMAL(9,2)字段。 我正在对它们执行以下操作(两个查询): 查询结果如下: 对于具有十进制列的表,为29秒 对于包含smallint列的表,为18秒 唯一的区别在于每种类型的“是”: 斯莫林是 小数点(9,2)为 这就是SMALLINT比DECIMAL(9,2)更快的原因吗 注意:我在每个表中都有相同的值-我没有小数-只有整数。是的,这是真的。Smal

是否有任何已知规则表明某些T-SQL类型更适合于计算

我有两个相同的表,其中包含数字-一个带有
SMALLINT
字段,另一个带有
DECIMAL(9,2)
字段。 我正在对它们执行以下操作(两个查询):

查询结果如下:

  • 对于具有十进制列的表,为29秒
  • 对于包含smallint列的表,为18秒
唯一的区别在于每种类型的“是”:

  • 斯莫林是
  • 小数点(9,2)为
这就是
SMALLINT
DECIMAL(9,2)
更快的原因吗


注意:我在每个表中都有相同的值-我没有小数-只有整数。

是的,这是真的。Smallint值需要更少的磁盘空间,IO操作具有更高的性能。尽可能使用“小”字体总是一个好主意。

来源:

从十进制或数字转换为浮点或实数可能会导致精度损失。从int、smallint、tinyint、float、real、money或smallmoney转换为十进制或数字可能导致溢出

默认情况下,SQL Server在将数字转换为精度和小数位数较低的十进制或数值时使用舍入。但是,如果启用了SET ARITHABORT选项,SQL Server将在发生溢出时引发错误。仅损失精度和刻度不足以引起误差

这强烈意味着围绕
十进制
算术的额外操作,特别是缩放、舍入和范围检查。所有这些都比加法更难(计算量更大),尤其是在x86CPU上


最快的数据类型是CPU固有的数据类型,通常是
char
integer
,在大多数SQL平台上应该是最快的。

我对这种修改的性能非常好奇:将“CASE SUM(B)WHEN 0然后NULL ELSE SUM(B)END”更改为:NullIf(SUM(B),0)@GMastros它需要相同的时间,但是我将把你的语法用于
NULLIF
,因为它更适合阅读。
SUM(CAST(A AS BIGINT))
SUM(CAST(A AS BIGINT))
CAST(CAST(SUM(A) AS decimal) / CASE SUM(B) WHEN 0 THEN NULL ELSE SUM(B) END * 100 AS decimal(18, 0))
CAST(CAST(SUM(A) AS decimal) / CASE SUM(B) WHEN 0 THEN NULL ELSE SUM(B) END * 100 AS decimal(18, 1)) 

SUM(CAST(A AS DECIMAL(19,2))) 
SUM(CAST(A AS DECIMAL(19,2)))
CAST(SUM(CAST([A] AS DECIMAL(19, 2))) / IIF(SUM(CAST([B] AS DECIMAL(19, 2))) = 0, NULL, SUM(CAST([B] AS DECIMAL(19, 2)))) * 100 AS DECIMAL(19, 0))
CAST(SUM(CAST([A] AS DECIMAL(19, 2))) / IIF(SUM(CAST([B] AS DECIMAL(19, 2))) = 0, NULL, SUM(CAST([B] AS DECIMAL(19, 2)))) * 100 AS DECIMAL(19, 1))