ASPICON GmbH Hartmannstraße 7
D-09111 Chemnitz
Fon +49.371.909515-100
Fax +49.371.909515-199
Email info@aspicon.de


Java-Regexp-PL/SQL nahezu 6-mal schneller als PL/SQL-RegExp!

Meldung vom 03.01.2012

 

Ein kleiner Eingriff mit großer Wirkung:
Seit einiger Zeit setzen wir, die Firma ASPICON, eine eigens angepasste System-Monitoring- und Management – Plattform für die Betreuung unserer zahlreichen zufriedenen Remote-DBA- Kunden ein. Dabei sind wir immer bestrebt, unseren Kunden den bestmöglichen Service bieten zu können. Aus diesem Grund suchten wir eine Möglichkeit, das  automatische Einordnen (“Acknowledgement”) von Alarmen und den zu monitorenden Ressourcen bei stetig steigenden Kundenzahlen zu beschleunigen.

Die große Herausforderung hierbei lag darin, dass am Ende sehr viele reguläre Ausdrücke für das Matching von Eigenschaften und Zusammenhängen angewendet werden müssen. Zu beachtende Faktoren hierbei waren z.B.: Alarme, Alarm-Setups, Kunden, Rechner, Datenbanken, Wartungszeiträume, bekannte/existierende Problemzustände, Zeit- und Datumsmuster oder auch verschieden priorisierte Einordnungsregeln (“Acknowledgement States”). Da sich die Systemzustände stetig ändern, müssen viele dieser Berechnungen in kurzen Zeitabständen aktualisiert werden. Damit wird verhindert, dass wichtige Alarmzustände oder deren Aufhebung verpasst werden.

Konkret wurde nun eine zentrale PL/SQL-Funktion als Flaschenhals identifiziert, welche diese Regeln größtenteils kapselt und mit Hilfe der Oracle-eigenen Funktion regexp_like hauptsächlich abbildet.
Da Java mittlerweile in vielen Projekten sogar C-Code outperformt und auch sonst sehr viele Vorteile vorweisen kann, nutzten wir dieses zur Lösung.

Unsere alte Funktion (stark vereinfacht):

create function match_plsql(  p_instr in varchar2,  p_regex in varchar2 )
    return integer deterministic is
begin
    if (regexp_like( p_instr, p_regex ) = true) then
        return 1;
    else
        return 0;
    end if;
end;



...wandelten wir in diesen Java-Ersatz (stark vereinfacht) um:


public class Match {
    public static boolean match(String in, String regexp) {
        return in.matches(regexp);
    }
}

create function match_java(  p_in in varchar2,  p_regex in varchar2 )
    return boolean as language java
name 'Match.match(java.lang.String, java.lang.String) return java.lang.Boolean';


...und kamen damit zu dem Ergebnis,dass wir durch einen relativ simplen Eingriff die gesamte Abfrage fast 6 mal schneller ausführen können:

SELECT ... match_plsql( ... ) ... 

 

SELECT ... match_java( ... ) ...

 

 

(Autor: Andreas Dietrich, ASPICON GmbH)





Zurück