Viele bisherige Projekte hatten neben Fehlerfreiheit auch einen performancegetriebenen Hintergrund. Laufzeiten mussten bisher immer so klein wie möglich gehalten werden. Aber es gibt evtl. auch bei Ihnen Projekte, bei welchen eine bestimmte garantierte Laufzeit nicht unterschritten werden darf. Dies könnte nötig sein, wenn Anwendungen bestimmte Reaktionzeiten bei Benutzeraktionen haben sollen, um beispielsweise zu schnelle Seitenwechselabfolgen zu verhindern oder bei Doppelklick nicht eine Aktion zweimal auszuführen.

Oracle Sleep()-Funktion aus DBMS_LOCK

Um eine einfache Verzögerung bei zu schneller Performance auf Datenbankebene in eine vorhandene Anwendung einzubauen, benötigen Sie eine neue Funktion, welche die Wartefunktion Sleep() aus dem Paket DBMS_LOCK aufruft. Eine einfache Version kann so aussehen:

create or replace function fkt_sleep( in_time number ) return number is
begin
 dbms_lock.sleep(in_time);
 return 1;
end;

Ein beispielhaftes SQL mit einer Minimalausführungszeit von 3 Sekunden erhält von Ihnen folgenden Aufbau:

SELECT name, vorname FROM telefonbuch WHERE fkt_sleep(3) = 1;
DELETE  FROM telefonbuch WHERE name = 'Mueller' AND fkt_sleep(3) = 1;

Triggerlaufzeit ändern

Bei DMS-Operationen können die Warteaufrufe auch an Trigger gebunden werden. Dann haben Sie bei INSERT/UPDATE/DELETE-Statements garantierte Mindestlaufzeiten. Ein Trigger sieht dann wie folgt aus:

CREATE OR REPLACE TRIGGER trg_telefonbuch
AFTER INSERT ON telefonbuch
BEGIN
    Dbms_Lock.sleep(3);
END;

Laufzeit dynamisch anpassen

Die Mindestlaufzeit müssen Sie nicht immer fest programmieren, sondern kann auch dynamisch berechnet werden. Dazu müssen Sie der oben definierten Funktion einen berechneten Wert übergeben. Im folgenden Beispiel soll die Laufzeit Tagsüber verlängert werden. Die Wartezeit ist Mittags die längste und Nachts die kürzeste Zeitspanne. Berechnet wird die Wartezeit mit y = (144 – (x-12)²) / 100 wobei x der jeweils aktuelle Stundenwert ist. Dadurch entsteht eine umgekehrte Zeitparabel.

SELECT name, vorname FROM telefonbuch 
       WHERE fkt_sleep( (144 - Power( ( To_Number( To_Char(SYSDATE, 'hh24') )  - 12  ) , 2) ) / 100) = 1;

Selbstverständlich können Sie auch auf die Systemtabelle v$sql von Oracle zugreifen und Mittelwerte der SQL-Laufzeiten ausrechnen, um zu Kernzeiten die Performance besser verteilen zu können.

Oracle warten lassen mit Sleep
Markiert in: