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 секунд, и все это касается условия ИЛИ.
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 вести себя в подобных ситуациях?
CATID
, а вот второй будет естественным сканированием. Возможно, вы захотите попробовать два отдельных запроса сUNION ALL
и посмотреть, как это работает. - person Mark Rotteveel   schedule 03.12.2013=
, если нет%
, но использоватьSIMILAR TO
, если:ISEARCH
имеет%
? Потому чтоSIMILAR TO
в строке без подстановочного знака должно совпадать с=
. - person Turophile   schedule 21.01.2014WITH
перед операторомSELECT
, чтобы получить необходимые данные из таблицыB
, затем удалите предложениеWHERE
из основного оператораSELECT
и посмотрите, решит ли это проблему. - person Radix   schedule 15.02.2014