1

我很困惑,因为我不了解 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, '%')))

这是执行计划: 2个条件的执行计划

什么也没有变!!!!使用两个 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秒。 1个条件的执行计划

谁能解释如何改进这个查询?有人可以帮我理解为什么短路不起作用吗?

4

0 回答 0