条件where子句导致Firebird性能很差

时间:2013-12-02 18:57:59

标签: sql firebird firebird2.5

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在这种情况下的行为?

1 个答案:

答案 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。这种方法的问题可能是加倍的条目,这将需要再次过滤。 (又名:一种新的蠕虫......)