Dzieje 0.001 sekund do wykonania i używa indeksu szukaćDlaczego Indeks nie jest używany z Podzapytanie
SELECT * FROM CUSTOMER WHERE ID IN (1008,1122)
Teraz mam procedura przechowywana U_VIP która zwraca ten sam identyfikator jako przykład jednego (1008,1122), a trwa tylko 0,001 sekundy do wykonania
SELECT ID FROM U_VIP //returns (1008,1122)
teraz, kiedy je połączyć, trwa około pół-sekundę do wykonania i indeks nie jest używany
SELECT * FROM CUSTOMER WHERE ID IN (SELECT ID FROM U_VIP)
Uprośniłem powyższy przykład, w rzeczywistym zastosowaniu na wydajność ma wpływ o wiele większa jasność. Jak zmusić Firebirda do korzystania z indeksu w tym przypadku?
** Korzystanie Firebird 2.1
** EDIT **
Bazę na odpowiedź Marka, wykorzystanie JOIN ma poprawić czas realizacji, ponieważ jest on teraz robi Indeks szukać.
SELECT CUSTOMER.*
FROM CUSTOMER
INNER JOIN U_VIP ON U_VIP.ID = CUSTOMER.ID
To świetnie, ale wprowadza kolejny problem, który spróbuję wyjaśnić w poniższym przykładzie.
SELECT CUSTOMER.*
FROM CUSTOMER
WHERE (:AREAID = 0 OR ID IN (SELECT ID FROM U_VIP(:AREAID)))
Używając klauzuli where, mogę warunkowo zastosować filtr na podstawie tego, czy: AREAID jest dostarczany przez użytkownika. Jak osiągnąć to samo, gdy zastępuję klauzulę where złączeniem?
Coś jak:
SELECT CUSTOMER.*
FROM CUSTOMER
{IF :AREAID > 0 THEN}
INNER JOIN (SELECT ID FROM U_VIP(:AREAID)) VIP ON VIP.ID = CUSTOMER.ID
{END IF}
Które oczywiście Firebird lubi część z szelkami =/
+1 za odpowiedź bardzo schludny mimo – Kagawa
@Kagawa Nie jestem pewien, czy rozumiem cię, ale myślę, używając 'unia (jeden normalny, a nie' UNION ALL'!) Z zapytanie łączące się na 'U_VIP' i dodatkowe zaznaczenie na' CUSTOMER' i użycie warunku 'CUSTOMER.ID =: INPUTCUSTID' na drugim zapytaniu powinno wystarczyć. Dzięki temu uzyskasz U_VIP i konkretnego klienta. –
@Kagawa Jeśli to jest aktualny problem, możesz zaktualizować swoje pytanie, aby dodać tę informację :) –