Firebird는 조건을 실행하는 방법을 모릅니다. 아니면 그것이 내가 생각하는 것입니다.조건부 절이 끔찍한 성능을 초래합니다. Firebird
첫 번째 쿼리는 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
)
어떻게 이런 종류의 상황에서 행동하라고 말할 수 있습니까?
각각에 대해 계획은 어떻게됩니까? 그것은 무슨 일이 일어나고 있는지에 대한 가장 큰 단서가 될 것입니다. – nater
첫 번째 쿼리는 'CATID'에 인덱스가있는 경우 최적화 될 수 있지만 두 번째 쿼리는 자연 스캔입니다. 'UNION ALL'을 사용하여 두 개의 쿼리를 시도해보고 어떻게 수행하는지 볼 수 있습니다. –
예, Firebird가 두 번째 쿼리를 처리 할 수없는 것 같습니다. OR 조건은 즉시 인덱스를 제거하고 계획을 강제 실행하더라도 전체 테이블 스캔을 수행합니다. 여러 가지 쿼리를 사용하여 솔루션에 접근해야했습니다. 이에 답변 해 주셔서 감사합니다. – user1791567