2016-06-08 7 views
0

Ich habe diese where-Klausel Bedingung in Oracle, um nach Namen zu suchen, die einem bestimmten Wert ähnlich sind, es gibt die richtigen Ergebnisse zurück, jedoch läuft es sehr langsam. Gibt es eine effizientere Möglichkeit, diese Bedingung auszuführen? Vielen Dank.Langsame Oracle-Ausführung

AND 
    (P5_ORGN_NAME IS NULL OR 

(D.ORGANIZATION_NAME LIKE '' || upper(P5_ORGN_NAME) || '%' OR D.FORMATTED_ORGANIZATION_NAME like 
'' || local.pkg.orgname_format(upper(P5_ORGN_NAME)) || '%') 
) 
+1

Haben Sie sich den Ausführungsplan angesehen? Was hat es gesagt? – nvoigt

+2

Die erste Sache, die Sie betrachten möchten, ist, diesen Aufruf 'local.pkg.orgname_format (oberer (P5_ORGN_NAME))' von der WHERE-Klausel loszuwerden. Der Aufruf von PL/SQL in der WHERE-Klausel ist oft ein Performance-Killer. –

+0

laufen erklären Plan, um zu sehen, was vor sich geht. Wenn Sie diese Funktion orgname_format verwenden müssen, sehen Sie sich den Funktionsindex an. – OldProgrammer

Antwort

2

Sprechen Sie die pkg.orgname_format Funktion DETERMINISTIC so Oracle nicht laufen sie immer und immer wieder für jede Zeile kennt.

In Ihrem local.pkg Paket ...

FUNCTION orgname_format (p_org_name VARCHAR2) 
    RETURN VARCHAR2 DETERMINISTIC IS 
BEGIN 
    ... 
END; 

Dies wird Oracle sagen, dass die Funktion immer den gleichen Wert für den gleichen Eingangsparameter Wert zurückgibt. Wenn Sie das wissen, kann Oracle die Funktion einmal ausführen, anstatt sie für jede Zeile in der/den zugrunde liegenden Tabelle (n) in Ihrer Abfrage auszuführen.

Natürlich können Sie das nur verwenden, wenn die Funktion wirklich deterministisch ist, was nach ihrem Namen klingt.

+0

Hat das funktioniert? –

+0

Danke Matthew! es ist jetzt extrem schnell :) – amaach