Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询中WHERE条件下CASE语句的性能_Sql_Performance_Case_Where Clause - Fatal编程技术网

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
表达式。在少数情况下,它们是需要的,但它们应该非常少地使用