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

Performace of CASE statement in WHERE condition in SQL query

我有这样的查询:

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+OR 构建相同的条件更具可读性。我使用 Oracle 和 Microsoft SQL 服务器。

是的。在 WHERE 子句中使用 CASE 表达式和布尔表达式之间存在重大差异。

在几乎所有数据库中,归结为“优化器理解布尔表达式”。 CASE 表达式要求它们按照定义的顺序进行计算。因此,优化器将只使用 table 扫描 运行 表达式。

这会影响索引使用和优化器使用。它可以在更复杂的查询中对按算法选择加入或分组产生下游影响。

另一个微妙的地方是你可以有像这样没有索引的表达式:

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

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

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