sql - 有条件的 where 子句导致 Firebird 的性能很差

标签 sql firebird firebird2.5

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/

相关文章:

firebird - Nbackup 从远程别名进行备份

delphi - 如何在 Delphi 中使用 dbExpress 将参数传递给查询

mysql - 触发以跟踪 MySQL 数据库中的更改

php - MySQL 表锁定(读)

c# - 通过 C# 转义 SQL INSERT INTO 中的特殊字符

java - 更新合并 onetomany jpa/hibernate - ConstraintViolationImpl

select - Firebird 中的简单选择失败

command-line - Firebird 定制安装

mysql - 从 Firebird 数据库连接到 MySQL 数据库

character - Firebird 2.5 WIN1258 charset 不支持越南语?