Betrachten wir eine deterministische Funktion wie:Wann verwendet eine deterministische Funktion den vorherigen berechneten Wert?
CREATE OR REPLACE FUNCTION SCHEMA.GET_NAME(ss_id nvarchar2
) RETURN nvarchar2 DETERMINISTIC IS
tmpVar nvarchar2(500);
BEGIN
select name into tmpvar from logistics.organization_items
where id = ss_id ;
return tmpvar ;
END ss_name;
Mit Toad ich die SCHEMA.GET_NAME(1)
genannt und es gibt A
. Ich habe dann den Wert aus der Tabelle von A
zu B
geändert und die SCHEMA.GET_NAME(1)
zurückgegeben B
zurückgerufen.
Es ist ein gutes Ergebnis. Aber ich fürchte, der Wert nicht aktualisiert wird nach this page in the documentation, die sagte:
Wenn Oracle Database eine deterministische Funktion in einem dieser Kontexten begegnet, versucht er zuvor berechnete Ergebnisse zu verwenden, wenn möglich, anstatt reexecuting die Funktion. Wenn Sie anschließend die Semantik der Funktion ändern, müssen Sie alle abhängigen funktionsbasierten Indizes und materialisierten Sichten manuell neu erstellen.
In welchen Situationen würde der Wert von GET_NAME(1)
Rückkehr ein alter gecached Wert (A
statt B
)?
Danke für Ihre vollständige Antwort. Auch ich mag es jetzt, wie oft der Cache für diese Funktionen aktualisiert wird? Im Rahmen der Ausführung einer Abfrage? Nach einem Zeitintervall? Auf Speicherbedarf um den Cache zu befreien? – mehrandvd
Oder vielleicht sind Caches nur während einer Sitzung gültig. Also für eine neue Sitzung wird es Updates geben? – mehrandvd
@Mehrandvd - Ich kenne die Ins-und-Outs dieses Features nicht, aber ich habe das Gefühl, es ist wie bei den meisten anderen Optimierungen: Es passiert, wenn der Optimierer sich danach fühlt. Mit anderen Worten, es gibt ** NO WAY **, um zu garantieren, dass es zwischengespeichert/aktualisiert wird (es gibt einige Wahrscheinlichkeiten, meistens mit Caching, aber keine Garantien). Dies ist vergleichbar mit dem Ausführen einer Abfrage ohne 'ORDER BY' - Sie erhalten die Reihenfolge, die der Optimierer Ihnen zu geben entscheidet, nicht das, was Sie unbedingt haben wollen/erwarten. –