【发布时间】:2014-08-06 11:13:38
【问题描述】:
是否有任何已知规则表明某些 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 秒
- 18 秒用于具有 smallint 列的表
唯一的区别在于每种类型的再见:
这是SMALLINT 比DECIMAL(9,2) 更快的原因吗?
注意:我在每个表中都有相同的值 - 我没有十进制数 - 只有整数。
【问题讨论】:
-
我很好奇这个修改的性能:将“CASE SUM(B) WHEN 0 THEN NULL ELSE SUM(B) END”改为:NullIf(SUM(B), 0)
-
@GMastros 需要同样的时间,但我将使用
NULLIF的语法,因为它更适合阅读。
标签: performance tsql sql-server-2012 aggregate-functions sql-types