Firebird不知道如何执行条件where。或者这就是我的想法。
First查询在15ms后返回值。
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在这种情况下的行为?
答案 0 :(得分:0)
有点牵强,我对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
,但它值得一试......
最糟糕的情况是,您可以尝试将语句拆分为2个单独的查询,再次UNION ALL
处理POSITION('%' IN :ISEARCH) <> 0
和另一个B.CATID = :ISEARCH
。这种方法的问题可能是加倍的条目,这将需要再次过滤。 (又名:一种新的蠕虫......)