SQL查询中WHERE条件中CASE语句的性能



我有一个这样的查询:

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条件下使用CASE语句编写查询(示例#1(是否会对性能产生影响。有时,使用CASE语句(嵌套语句(比使用AND+OR构建相同的条件更容易读取更复杂的条件。我使用Oracle和Microsoft SQL Server。

是。在WHERE子句中使用CASE表达式和布尔表达式有很大的区别。

在几乎所有的数据库中;优化器理解布尔表达式";。CASE表达式要求按照定义它们的顺序对它们进行求值。因此,优化器将只使用表扫描来运行表达式。

这可能会影响索引的使用和优化器的使用。在更复杂的查询中,它可能会对通过算法选择联接或组产生下游影响。

另一个微妙的点是,你可能有这样的表达式没有索引:

where substr(y, 1000, 1002) = 'xyz' and x = 1

其中一个显然比另一个贵。在许多优化器中,在运行更昂贵的函数之前,会知道在x = 1上进行过滤。

建议避免在WHERE(和ON子句(中使用CASE表达式。在少数情况下需要它们,但应该非常谨慎地使用。

相关内容

  • 没有找到相关文章

最新更新