这个陈述比以前更快吗?

Lyn*_*hie 1 sql t-sql sql-server

如果我改变了这个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 ,
Run Code Online (Sandbox Code Playgroud)

如果我改为:

                CASE WHEN ClaimNo.ClaimNo >= 5 THEN '5+'
                ELSE COALESCE(ClaimNo.ClaimNo,0) END 'ClaimNo' ,
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*off 10

这些都不一样!该case表达式返回一个类型,在这种情况下,你想要的类型为字符串(因为'5+'是一个字符串).但是,在wheres中混合字符串和整数将导致类型转换错误.

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

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

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

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

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