是否有任何已知的规则说某些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)
更快的原因吗?
注意:我在每个表中都有相同的值 - 我没有十进制数 - 只有整数。
答案 0 :(得分:1)
是的,那是真的。 Smallint值需要较少的磁盘空间,IO操作具有更高的性能。尽可能选择“小”类型总是一个好主意。
答案 1 :(得分:0)
从十进制或数字转换为float或real会导致一些精度损失。从int,smallint,tinyint,float,real,money或smallmoney转换为十进制或数字可能会导致溢出。
默认情况下,SQL Server在将数字转换为具有较低精度和比例的小数或数值时使用舍入。但是,如果SET ARITHABORT选项为ON,则SQL Server会在发生溢出时引发错误。仅精度和比例的损失不足以引起错误。
这强烈暗示额外的操作围绕decimal
算术,特别是缩放,舍入和范围检查。所有这些都比添加更加困难(计算密集程度更高),尤其是在x86 CPU上。
最快的数据类型是CPU的本机 - 通常是char
和integer
- 在大多数SQL平台上应该是最快的。