我很困惑,因为我不理解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, '%')))
什么都没改变!!!!
两个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)
任何人都可以解释如何改进此查询吗? 有人能帮助我理解为什么短路不起作用吗?