当我们使用SMALLINT而不是DECIMAL时,为什么SUM更快

时间:2014-06-16 15:14:26

标签: performance tsql sql-server-2012 aggregate-functions sql-types

是否有任何已知的规则说某些T-SQL类型更适合计算?

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

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))

并且查询结果如下:

  • 带有十进制列的表格的29秒
  • 使用smallint列的表格的时间为18秒

唯一的区别在于每种类型的字节:

这是SMALLINTDECIMAL(9,2)更快的原因吗?

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

2 个答案:

答案 0 :(得分:1)

是的,那是真的。 Smallint值需要较少的磁盘空间,IO操作具有更高的性能。尽可能选择“小”类型总是一个好主意。

答案 1 :(得分:0)

来自Microsoft's documentation

  

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

     

默认情况下,SQL Server在将数字转换为具有较低精度和比例的小数或数值时使用舍入。但是,如果SET ARITHABORT选项为ON,则SQL Server会在发生溢出时引发错误。仅精度和比例的损失不足以引起错误。

这强烈暗示额外的操作围绕decimal算术,特别是缩放,舍入和范围检查。所有这些都比添加更加困难(计算密集程度更高),尤其是在x86 CPU上。

最快的数据类型是CPU的本机 - 通常是charinteger - 在大多数SQL平台上应该是最快的。