SQL查询中WHERE条件下CASE语句的性能
我有这样一个问题:SQL查询中WHERE条件下CASE语句的性能,sql,performance,case,where-clause,Sql,Performance,Case,Where Clause,我有这样一个问题: SELECT Column1, Column2, ... FROM Table WHERE ( CASE WHEN Column1 = 'Value1' AND Column2 = 'Value2' THEN 'ok' ELSE 'nok' END = 'ok' ) SELECT Column1, Column2, ... FROM Table WHERE Column1 = 'Valu
SELECT Column1, Column2, ...
FROM Table
WHERE (
CASE
WHEN Column1 = 'Value1'
AND Column2 = 'Value2'
THEN 'ok'
ELSE 'nok'
END = 'ok'
)
SELECT Column1, Column2, ...
FROM Table
WHERE Column1 = 'Value1'
AND Column2 = 'Value2'
我知道我可以像这样重写条件:
SELECT Column1, Column2, ...
FROM Table
WHERE (
CASE
WHEN Column1 = 'Value1'
AND Column2 = 'Value2'
THEN 'ok'
ELSE 'nok'
END = 'ok'
)
SELECT Column1, Column2, ...
FROM Table
WHERE Column1 = 'Value1'
AND Column2 = 'Value2'
我的问题是,与使用简单条件(示例2)的查询相比,使用WHERE条件(示例1)编写带有CASE语句的查询是否有任何性能影响。有时,使用CASE语句(嵌套语句)比使用AND+或构建相同的条件更容易理解更复杂的条件。我使用Oracle和Microsoft SQL Server。是。在
WHERE
子句中使用CASE
表达式和布尔表达式之间有很大的区别
在几乎所有数据库中,这归结为“优化器理解布尔表达式”<代码>大小写表达式要求按照定义的顺序对其求值。因此,优化器将只使用表扫描来运行表达式
这可能会影响索引使用和优化器使用。它可以在更复杂的查询中对连接或分组算法的选择产生下游影响
另一个微妙的点是,你可以有这样的表达式,而不是索引:
where substr(y, 1000, 1002) = 'xyz' and x = 1
其中一个显然比另一个贵。在许多情况下,优化器会知道在运行更昂贵的函数之前先过滤x=1
建议避免使用WHERE
(和ON
子句中的CASE
表达式。在少数情况下,它们是需要的,但它们应该非常少地使用