Best Practice – RESULT CACHE – Werte aus Parametertabelle abfragen
In nahezu jeder Applikation die ich kenne, wird eine Parametertabelle für globale Konfigurationsparameter eingesetzt. Meist werden die Parameterwerte mit einer get_ParameterWert Funktion ausgelesen und in der Programmlogik verwendet.
Mit wenig Codeänderung kann eine massive Performanceverbesserung durch den Einsatz des ORACLE RESULT CACHES erreicht werden.
Best Practice – RESULT CACHE – Demo
In dem folgenden Beispiel wird eine Parametertabelle mit Konfigurationsparametern, sowie eine allgemeine Zugriffsfunktion erstellt, die die Parameter ausliest.
Die bestehende Funktion get_ParameterWert wird um die Funktionalität des Oracle RESULT CACHE erweitert. Anhand eines Testscriptes wird die Performanceverbesserung transparent und nachvollziehbar dargestellt.
Parametertabelle mit Daten anlegen
Es wird eine Parametertabelle – Key/Value – inklusive Beispielparameter angelegt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
-- Parametertabelle erstellen CREATE TABLE PARAMETER_BESSERDICH (ID NUMBER ,NAME VARCHAR2(50) NOT NULL ,wert VARCHAR2(100) NOT NULL ,CONSTRAINT PARAMETER_PK PRIMARY KEY(ID) ,CONSTRAINT PARAMETER_NAME_UQ UNIQUE (NAME) ); -- 3 Parameter in die Parametertabelle einfügen INSERT INTO PARAMETER_BESSERDICH VALUES(1,'FIRMENNAME','BESSERDICH IT CONSULTING'); INSERT INTO PARAMETER_BESSERDICH VALUES(2,'ORT','BERLIN'); INSERT INTO PARAMETER_BESSERDICH VALUES(3,'PLZ','14165'); INSERT INTO PARAMETER_BESSERDICH VALUES(4,'BASE-URL','www.besserdich.com'); -- Transaktion festschreiben COMMIT; |
Funktion get_ParameterWert anlegen
Es werden 2 identische Funktionen angelegt – eine mit Result Cache und eine ohne.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
PROMPT Funktion get_ParameterWert_mit_rc mit Result Cache anlegen CREATE OR REPLACE FUNCTION get_ParameterWert_mit_rc(pi_parametername IN PARAMETER_BESSERDICH.NAME%TYPE) RETURN PARAMETER_BESSERDICH.WERT%TYPE RESULT_CACHE RELIES_ON (PARAMETER_BESSERDICH) IS lv_return PARAMETER_BESSERDICH.WERT%TYPE; BEGIN SELECT t.wert INTO lv_return FROM PARAMETER_BESSERDICH t WHERE 1=1 AND t.NAME = pi_parametername; RETURN lv_return; END get_ParameterWert_mit_rc; / PROMPT Funktion get_ParameterWert_ohne_rc ohne Result Cache anlegen CREATE OR REPLACE FUNCTION get_ParameterWert_ohne_rc(pi_parametername IN PARAMETER_BESSERDICH.NAME%TYPE) RETURN PARAMETER_BESSERDICH.WERT%TYPE IS lv_return PARAMETER_BESSERDICH.WERT%TYPE; BEGIN SELECT t.wert INTO lv_return FROM PARAMETER_BESSERDICH t WHERE 1=1 AND t.NAME = pi_parametername; RETURN lv_return; END get_ParameterWert_ohne_rc; / |
Performancemessung
Dieses kleine Demoscript fragt jeden Parameter aus der Parametertabelle 1 Million mal ab. Das Script muss mit SQL*Plus ausgführt werden.
Auf meiner Oracle Datenbank ist die Implementierung mittels RESULT CACHE um den Faktor 60 schneller.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
SET TIMING ON SET SERVEROUTPUT ON col ID format 99 col NAME format a30 col VALUE format a12 PROMPT Result Cache wird geleert exec dbms_result_cache.flush PROMPT Auslesen der Result Cache Statistiken vor Testscript Ausfuehrung SELECT * FROM v$result_cache_statistics / PROMPT Testscript fuehrt 1Millionen abfragen pro Parameter durch PROMPT Der ResultCache wird verwendet DECLARE v_Return VARCHAR2(100); TYPE t_PARAMETERNAME_nt IS TABLE OF parameter_besserdich.NAME%TYPE; lnt_paramentername t_PARAMETERNAME_nt := t_PARAMETERNAME_nt('FIRMENNAME','ORT','PLZ','BASE-URL'); BEGIN FOR i IN lnt_paramentername.FIRST .. lnt_paramentername.LAST LOOP dbms_output.put_line('PARAMETER: ' || lnt_paramentername(i)); FOR ii IN 1..1000000 loop v_Return := get_ParameterWert_mit_rc(PI_PARAMETERNAME => lnt_paramentername(i)); END LOOP; END LOOP; END; / PROMPT Auslesen der Result Cache Statistiken nach Testscript Ausfuehrung SELECT * FROM v$result_cache_statistics / PROMPT Testscript fuehrt 1Millionen Abfragen pro Parameter durch PROMPT Es wird kein ResultCache verwendet DECLARE v_Return VARCHAR2(100); TYPE t_PARAMETERNAME_nt IS TABLE OF parameter_besserdich.NAME%TYPE; lnt_paramentername t_PARAMETERNAME_nt := t_PARAMETERNAME_nt('FIRMENNAME','ORT','PLZ','BASE-URL'); BEGIN FOR i IN lnt_paramentername.FIRST .. lnt_paramentername.LAST LOOP dbms_output.put_line('PARAMETER: ' || lnt_paramentername(i)); FOR ii IN 1..1000000 loop v_Return := get_ParameterWert_ohne_rc(PI_PARAMETERNAME => lnt_paramentername(i)); END LOOP; END LOOP; END; / |
Fazit
Durch dem Einsatz von Oracle RESULT CACHE kann eine massive Verbesserung der Performance erreicht werden. Zu prüfen sind natürlich immer die individuellen Gegebenheiten. U.U.sind nur wenige Zeilen Code anzupassen.
SCHREIBEN SIE EINEN KOMMENTAR