Ich habe einen Anwendungsfall für die Durchführung einer Abfrage für mehrere optionale Parameter. Einige Parameter können während der Abfrageausführung übergeben werden.Oracle SQL Query optionale Parameter Leistung
Bis jetzt habe ich zwei verschiedene Lösungen gefunden. Ich brauche Hilfe, um herauszufinden, welche Leistung besser ist? Oder gibt es eine andere alternative Lösung?
user_passed_variable IS NULL OR SOME_COLUMN = user_passed_variable
NVL(SOME_COLUMN, ’null’) = NVL(user_passed_variable, NVL(SOME_COLUMN, ’null’))
Hinweis: Die Säule kann auch Nullwerte halten.
Nicht genug Details hier, aber das Anwenden einer Funktion auf eine Tabellenspalte, wie NVL (SOME_COLUMN), kann den Optimierer einschränken. In diesem Fall können Sie einen funktionsbasierten Index erstellen. Da wir nicht wissen, dass Ihre Tabelle wie folgt aussieht und welche Indizes Sie usw. haben, können Sie keine große Hilfe bieten. – OldProgrammer
Wenn zwei Bedingungen durch 'ODER' getrennt sind, wird die Verwendung eines Indexes für 'SOME_COLUMN' verhindert. So wird die Funktion aufrufen (und es ist nicht klar, wie ein funktionsbasierter Index helfen würde, da NVL (SOME_COLUMN, 'null') 'auch in einem anderen 'NVL()' Aufruf enthalten ist). Möglicherweise gibt es Lösungen, die die Verwendung eines Index ermöglichen. 'Select * from EMP wo null UNION ALL select * from EMP wo ANGNR = ' –
mathguy
In diesem Beispiel: Zum Beispiel, wenn ich von 'EMP' wo' ANGNR = 'oder' ist NULL' Zeilen ausgewählt wollte Wenn die Benutzereingabe "NULL" ist, ruft das erste Mitglied von "UNION ALL" alles ab, während das zweite Mitglied sofort als leer erkannt wird. Wenn die Eingabe nicht "NULL" ist, wird das erste Mitglied sofort als leer erkannt, und das zweite Mitglied kann einen Index für "EMPNO" ausnutzen. –
mathguy