繁体   English   中英

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

[英]Why SUM is faster when we are using SMALLINT instead DECIMAL

是否有已知规则说某些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)更快的原因吗?

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

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

Microsoft的文档中

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

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

这强烈意味着额外的运算会围绕decimal算术,特别是缩放,舍入和范围检查。 所有这些都比添加要难得多(计算强度更大),尤其是在x86 CPU上。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM