SQL查询中WHERE条件下CASE语句的表现

问题描述 投票:0回答:1

我有这样的疑问:

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 Server。

sql performance case where-clause
1个回答
0
投票

是的。 在

CASE
子句中使用
WHERE
表达式和布尔表达式之间有一个非常非常大的区别。

在几乎所有数据库中,这都归结为“优化器理解布尔表达式”。

CASE
表达式要求按照定义的顺序对它们进行求值。 因此,优化器将仅使用表扫描并运行表达式。

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

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

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

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

x = 1

建议避免在

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

© www.soinside.com 2019 - 2024. All rights reserved.