Firebird 不知道如何执行条件 where。或者这就是我的想法。
第一个查询在 15 毫秒后返回值。
SELECT DISTINCT
A.MANID,
A.DISNO,
A.DISID
FROM
TABLEB B
INNER JOIN TABLEA A ON (A.ITEM_ID = B.ITEM_ID)
WHERE
(
(POSITION('%' IN :ISEARCH) = 0 AND B.CATID = :ISEARCH)
)
第二个查询用了 40 多秒,而且都是关于 OR 条件的。
SELECT DISTINCT
A.MANID,
A.DISNO,
A.DISID
FROM
TABLEB B
INNER JOIN TABLEA A ON (A.ITEM_ID = B.ITEM_ID)
WHERE
(
(POSITION('%' IN :ISEARCH) = 0 AND B.CATID = :ISEARCH) OR
POSITION('%' IN :ISEARCH) <> 0
)
我如何告诉 firebird 在这种情况下表现?
最佳答案
有点牵强,我不熟悉 Firebird,但对于这种特殊情况,我建议尝试
(
(POSITION('%' IN :ISEARCH) = 0 AND B.CATID = :ISEARCH) OR
POSITION('%' IN :ISEARCH) <> 0
)
写成这样
(
(POSITION('%' IN :ISEARCH) <> 0 OR B.CATID = :ISEARCH)
)
哪个对查询优化器更有意义?
它仍然是一个 OR
许多 RDBMS 不喜欢 OR
s 但值得一试...
最坏的情况是您可以尝试将语句拆分成两个单独的查询 UNION ALL
再次在一起处理POSITION('%' IN :ISEARCH) <> 0
和另一个B.CATID = :ISEARCH
.该方法的问题可能是需要再次过滤掉的条目加倍。 (又名:一 jar 新的蠕虫……)
关于sql - 有条件的 where 子句导致 Firebird 的性能很差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20335751/