这个陈述比以前更快吗?

时间:2018-02-13 12:07:35

标签: sql sql-server tsql

如果我改变了这个CASE语句的逻辑,我正在运行一些旧代码:

                CASE WHEN ClaimNo.ClaimNo IS NULL THEN '0'
                     WHEN ClaimNo.ClaimNo = 1 THEN '1'
                     WHEN ClaimNo.ClaimNo = 2 THEN '2'
                     WHEN ClaimNo.ClaimNo = 3 THEN '3'
                     WHEN ClaimNo.ClaimNo = 4 THEN '4'
                     ELSE '5+'
                END AS ClaimNo ,

如果我将其更改为:

                CASE WHEN ClaimNo.ClaimNo >= 5 THEN '5+'
                ELSE COALESCE(ClaimNo.ClaimNo,0) END 'ClaimNo' ,

声明在技术上会更快吗?它作为一个陈述显然要短得多,并且似乎不会运行尽可能多的语句来获得相同的结果。

1 个答案:

答案 0 :(得分:10)

这些不一样! case表达式返回一种类型,在这种情况下,您希望类型为字符串(因为'5+'是一个字符串)。但是,在where s中混合字符串和整数将导致类型转换错误。

哪个更快取决于数据的分布。如果大多数数据包含5个或更多,那么第二种方法会更快。 。 。如果写成:

(CASE WHEN ClaimNo.ClaimNo >= 5 THEN '5+'
      ELSE CAST(COALESCE(ClaimNo.ClaimNo, 0) as VARCHAR(255))
 END) as ClaimNo,

事实上,只有一个比较,所以从比较的角度来看会更快。

接下来的问题是,从数字到字符串的转换是否比单独列出的每个值的多重比较更快。说实话:我不知道。我长期以来一直关注查询性能。

为什么我不知道?这种微观优化通常对现实世界基本没有影响。你应该使用有效逻辑的版本;可读性和可维护性也很重要。当然性能是一个问题,但在其他语言中很重要的位技术通常在SQL中没有位置,这些技术旨在处理大量数据,分布在多个处理器和磁盘上。