Sql 这句话比前一句快吗?
如果我更改了这个CASE语句的逻辑,我正在运行一些旧代码:Sql 这句话比前一句快吗?,sql,sql-server,tsql,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
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' ,
从技术上讲,这个声明会更快吗?作为一个语句,它显然要短得多,而且似乎不会运行那么多的语句来获得相同的结果。这些语句是不一样的!case表达式返回一个类型,在本例中,您希望该类型为字符串,因为“5+”是字符串。但是,在where中混合字符串和整数将导致类型转换错误 哪个更快取决于数据的分布。如果大多数数据包含5个或更多,则第二种方法将更快。如果写为:
(CASE WHEN ClaimNo.ClaimNo >= 5 THEN '5+'
ELSE CAST(COALESCE(ClaimNo.ClaimNo, 0) as VARCHAR(255))
END) as ClaimNo,
事实上,只有一个比较,所以从比较的角度来看,它会更快
下一个问题是,从数字到字符串的转换是否比单独列出每个值的多次比较快。老实说,我不知道。很长一段时间以来,我一直关注查询性能
为什么我不知道?这种微观优化在现实世界中基本上没有影响。您应该使用有效的逻辑版本;可读性和可维护性也很重要。当然,性能是一个问题,但是在其他语言中很重要的位篡改技术在SQL中通常没有一席之地,SQL设计用于处理大量数据,这些数据分布在多个处理器和磁盘上。这些都不一样!case表达式返回一个类型,在本例中,您希望该类型为字符串,因为“5+”是字符串。但是,在where中混合字符串和整数将导致类型转换错误 哪个更快取决于数据的分布。如果大多数数据包含5个或更多,则第二种方法将更快。如果写为:
(CASE WHEN ClaimNo.ClaimNo >= 5 THEN '5+'
ELSE CAST(COALESCE(ClaimNo.ClaimNo, 0) as VARCHAR(255))
END) as ClaimNo,
事实上,只有一个比较,所以从比较的角度来看,它会更快
下一个问题是,从数字到字符串的转换是否比单独列出每个值的多次比较快。老实说,我不知道。很长一段时间以来,我一直关注查询性能
为什么我不知道?这种微观优化在现实世界中基本上没有影响。您应该使用有效的逻辑版本;可读性和可维护性也很重要。性能当然是一个问题,但在其他语言中很重要的位篡改技术在SQL中通常没有一席之地,SQL设计用于处理大量数据,分散在多个处理器和磁盘上。为什么不试试呢?如果你能找到任何现实世界中的场景,其中的差异甚至会影响性能,而不是维护,我会给你一个奖励。第二个是字符串与整数的混合。第一个不给ClaimNo=0的机会。我建议先研究准确度。顺便说一句,案例表达。T-SQL中没有CASE语句。正如公认答案中指出的,第二种语法无效。在询问哪个更快之前,您应该先测试语法。为什么不试试呢?如果您能找到任何实际场景,其中的差异甚至会影响性能,而不是维护,我会给您一个奖励。第二个是字符串与int的混合。第一个不给ClaimNo=0的机会。我建议先研究准确度。顺便说一句,案例表达。T-SQL中没有CASE语句。正如公认答案中指出的,第二种语法无效。在询问哪个更快之前,应该先测试语法。