Dies dauert 0,001 Sekunden auszuführen, und es nutzt IndexWarum Index nicht mit Unterabfrage verwendet
SELECT * FROM CUSTOMER WHERE ID IN (1008,1122)
Jetzt habe ich eine gespeicherte Prozedur U_VIP suchen, die die gleiche ID wie Beispiel gibt ein (1008,1122) und es nur 0,001 Sekunden
SELECT ID FROM U_VIP //returns (1008,1122)
Jetzt auszuführen, wenn ich sie kombinieren, dauert es etwa ein halbes Sekunde auszuführen und Index nicht
SELECT * FROM CUSTOMER WHERE ID IN (SELECT ID FROM U_VIP)
verwendet wird
Ich habe das obige Beispiel vereinfacht, in der tatsächlichen Anwendung wird die Leistung von viel höherer Größenordnung beeinflusst. Wie erzwinge Firebird in diesem Fall den Index zu verwenden?
** Firebird 2.1
Mit ** EDIT **
Base auf Mark Antwort, JOIN die Ausführungszeit nicht verbessert, weil es jetzt Index suchen zu tun.
SELECT CUSTOMER.*
FROM CUSTOMER
INNER JOIN U_VIP ON U_VIP.ID = CUSTOMER.ID
Dieser große ist, stellt es jedoch ein weiteres Problem für mich, die ich versuchen werde im folgenden Beispiel zu erklären.
Mit where-Klausel kann ich die Filterbasis abhängig davon verwenden, ob: AREAID vom Benutzer bereitgestellt wird. Wie erreiche ich dasselbe, wenn ich die WHERE-Klausel durch einen Join ersetze?
Etwas wie:
SELECT CUSTOMER.*
FROM CUSTOMER
{IF :AREAID > 0 THEN}
INNER JOIN (SELECT ID FROM U_VIP(:AREAID)) VIP ON VIP.ID = CUSTOMER.ID
{END IF}
Was natürlich, Firebird den Teil mit Klammern =/
1 auch für sehr ordentlich Antwort dennoch – Kagawa
@Kagawa Ich bin nicht sicher, ob ich verstehe dich, aber ich denke, eine 'UNION' (eine normale, nicht' UNION ALL'!) Mit der die Abfrage, die sich an "U_VIP" anschließt, und eine zusätzliche Auswahl an "KUNDE" und die Verwendung der Bedingung "KUNDE.ID =: EINGANGSKENNWORT" bei der zweiten Abfrage würden den Trick machen. Dadurch erhalten Sie die U_VIP und den spezifischen Kunden. –
@Kagawa Wenn das das eigentliche Problem ist, möchten Sie vielleicht Ihre Frage aktualisieren, um diesen Teil der Info hinzuzufügen :) –