Performance von regexp_replace vs in Oracle übersetzen?

8

Für einfache Dinge ist es besser, die Funktion translate unter der Prämisse zu verwenden, dass sie weniger CPU-intensiv ist oder regexp_replace der Weg ist?

Diese Frage kommt von Wie kann ich Klammern zu Bindestrichen innerhalb der Oracle REGEXP_REPLACE-Funktion ersetzen?

    
Colin 't Hart 17.04.2013, 11:01
quelle

2 Antworten

10

Ich denke, Sie stoßen auf einfache Optimierung. Der Regexp-Ausdruck ist so teuer zu berechnen, dass das Ergebnis zwischengespeichert wird in der Hoffnung, dass es in Zukunft wieder verwendet wird. Wenn Sie tatsächlich unterschiedliche Zeichenfolgen zum Konvertieren verwenden, werden Sie sehen, dass die einfache Übersetzung natürlich schneller ist, weil es ihre spezialisierte Funktion ist.

Hier ist mein Beispiel, das auf 11.1.0.7.0 :

läuft %Vor%

in 11.2.0.3.0 :

%Vor%

Fazit: Im Allgemeinen vermute ich, dass translate gewinnt.

    
Vincent Malgrat 17.04.2013 11:07
quelle
4

Für SQL habe ich das mit dem folgenden Skript getestet:

%Vor%

und festgestellt, dass die Leistung von translate und regexp_replace fast immer gleich war, aber es könnte sein, dass die Kosten der anderen Operationen die Kosten der Funktionen, die ich testen möchte, überfordern.

>

Als nächstes habe ich eine PL / SQL-Version ausprobiert:

%Vor%

Hier dauert die translate Version knapp 10 Sekunden, während die regexp_replace Version etwa 0,2 Sekunden dauert - etwa 2 Größenordnungen schneller (!)

Aufgrund dieses Ergebnisses werde ich in meinem performance-kritischen Code sehr viel häufiger reguläre Ausdrücke verwenden - sowohl SQL als auch PL / SQL.

    
Colin 't Hart 17.04.2013 11:01
quelle

Tags und Links