[英]why is it faster to print number in binary using arithmetic instead of _bittest
[英]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))
那里的查询结果是关于:
每种类型的唯一区别是:
这是因为SMALLINT
比DECIMAL(9,2)
更快的原因吗?
注意:我在每个表中都有相同的值-我没有十进制数字-只有整数。
是的,这是真的。 Smallint值需要较少的磁盘空间,并且IO操作具有更高的性能。 尽可能具有“小”字型总是一个好主意。
从十进制或数字转换为浮点数或实数会导致精度降低。 从int,smallint,tinyint,float,real,money或smallmoney转换为十进制或数字都可能导致溢出。
默认情况下,SQL Server在将数字转换为精度和小数位数较低的十进制或数字值时使用舍入。 但是,如果SET ARITHABORT选项为ON,则在发生溢出时SQL Server会引发错误。 仅精度和规模的损失不足以引起误差。
这强烈意味着额外的运算会围绕decimal
算术,特别是缩放,舍入和范围检查。 所有这些都比添加要难得多(计算强度更大),尤其是在x86 CPU上。
最快的数据类型是CPU固有的数据类型(通常是char
和integer
,并且在大多数SQL平台上应该是最快的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.