ORACLE - 短CIrcuit“OR”运算符:不工作?

时间:2016-10-05 12:34:32

标签: sql oracle where-clause short-circuiting or-operator

我很困惑,因为我不理解Oracle计划执行查询。 这是原始查询:

SELECT *
FROM T1 INNER JOIN T2
ON TI.INDEX1 = T2.INDEX1
WHERE
        T1.C1 LIKE CONCAT('%', CONCAT(:param1, '%'))
    AND T2.C2 LIKE CONCAT('%', CONCAT(:param2, '%'))

此查询结果需要60秒(我对两个参数都使用空值)。

我找到了问题并且我发现T2.C2是问题所在。 没有秒的相同查询,其中条件需要15秒,所以,我的变形如下:

SELECT *
FROM T1 INNER JOIN T2
ON TI.INDEX1 = T2.INDEX1
WHERE
        (:param1 IS NULL OR T1.C1 LIKE CONCAT('%', CONCAT(:param1, '%')))
    AND (:param2 IS NULL OR T2.C2 LIKE CONCAT('%', CONCAT(:param2, '%')))

这是执行计划: Execution plan with 2 condition

什么都没改变!!!! 两个where子句查询需要60秒!!!

我把它绑起来了:

SELECT *
FROM T1 INNER JOIN T2
ON TI.INDEX1 = T2.INDEX1
WHERE
        (:param1 IS NULL OR T1.C1 LIKE CONCAT('%', CONCAT(:param1, '%')))
    AND (:param2 IS NULL)

这需要15秒。 Execution plan with 1 condition

任何人都可以解释如何改进此查询吗? 有人能帮助我理解为什么短路不起作用吗?

0 个答案:

没有答案