![]() |
Datenbank: Firebird • Version: 3.0 • Zugriff über: Delphi
Firebird 3.0 - Stored Functions & Schlüsselwort deterministic
Hallo Zusammen,
ich habe heute entdeckt, dass man im Firebird 3.0 Stored Functions das Schlüsselwort "Deterministic" mitgeben kann. Beispiel:
Delphi-Quellcode:
Ich frage mich nur, was das bedeutet?
create or alter function SF_CRLF
returns char(2) deterministic AS begin return ascii_char(13) || ascii_char(10); end Leider bringt mich die Googlesuche nicht sonderlich weit und die ReleaseNotes auch nicht. Ich finde nur ![]() Und ich habe ein ![]() Ich habe nun die Vorstellung, dass er Prozeduren, die immer den gleichen Rückgabewert haben anders kompiliert und die BLR vorteilhafter ist. Das ist aber nur so eine Vermutung. Hat da jemand gesicherte Informationen? Gruß Jan |
AW: Firebird 3.0 - Stored Functions & Schlüsselwort deterministic
Laut :
![]() Zitat:
|
AW: Firebird 3.0 - Stored Functions & Schlüsselwort deterministic
Einige DBMS bieten es an, dass man SPs entsprechend markieren kann, wenn sie bestimmte Bedingungen erfüllen, wie Beispielsweise
* Result ist immer NULL, wenn mindestens ein Parameter NULL ist -> ist ein Parameter NULL, braucht die SP also garnicht erst ausgeführt werden * SP verändert keine Daten in der DB (macht nur SELECTs, aber kein INSERT/UPDATE/DELETE) * SP gibt immer das selbe Ergebnis zurück, bei gleichen Parametern (während dieser Abfrage, innerhalb der Connection/Session oder gar für die ganze Laufzeit der DB) * ... So kann das DBMS seine Arbeit besser steuern, indem es z.B. Ergebnisse cached und die SP seltener ausführt. Du hast z.B. eine Funktion im SELECT/WHERE, die für zu einem Wert immer den gleichen anderen zugehörigen Wert holt.
SQL-Code:
SELECT id, xyz, GetValueFromXyz(xyz) FROM table WHERE ...
Hast'e jetzt deine SP als DETERMINISTIC markiert, dann kann FB den aufruf optimieren, für den Fall die Funktion wird mehrmals mit dem selben Parametern aufgerufen. Normal bräuchte dieses SELECT 20 Sekunden und deterministisch nur 5.
SQL-Code:
anderes Beispiel:
CREATE FUNCTION TestDeterm(param1 INTEGER) RETURNS INTEGER DETERMINISTIC AS
BEGIN Sleep(1000); -- k.A. wie man das in FB macht RETURN param1 * 2; END; SELECT TestDeterm(x) FROM (VALUES (1), (2), (3), (4), (5), (1), (2), (3), (4), (5), (1), (2), (3), (4), (5), (1), (2), (3), (4), (5) ) AS temp (x) IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF ![]() |
AW: Firebird 3.0 - Stored Functions & Schlüsselwort deterministic
Zitat:
|
AW: Firebird 3.0 - Stored Functions & Schlüsselwort deterministic
Neben den Erläuterungen von Himitsu würde ich ergänzen (halbwissen), dass der Determinismus sinnvollerweise an die Eingangsparameter gekoppelt sein muss.
Wenn also wie in einem Beispiel, nur ein Zeilenumbruch geliefert wird, ganz ohne Parameter find ich das schon ziemlich(? gibt es das?) deterministisch. Wenn der Zeilenumbruch abhängig von einem Eingangsparameter Windows:boolean true|false geliefert wird, immer noch ziemlich deterministisch, denn konstante Eingangsparameter liefern immer gleiches Ergebnis. Liefert die Funktion aber einen Zeilenumbruch im Windows oder Unixstyle abhängig von sagen wir den Usersettings und dessen bevorzugter CSV Ausgabeeinstellung, wird es schwierig mit deterministisch. Bei einer DB dürfte m.E. hier auch der DB Kontext eine Rolle spielen, also Session oder auch nur Transaktion. Da könnte sogar eine Funktion getCountOfTable deterministisch sein, wenn sie innerhalb der Transaktion nicht geändert wird. Am Ende alles implementierungsabhängig. Wenn die Doku nichts hergibt, hilft nur ausprobieren. Am besten gleich mit einer Count(*) Funktion auf einer großen Tabelle, sprich einer Funktion, die auch viel Zeit braucht und damit leicht messbar ist und gut prüfbar, was den Rückgabewert angeht. |
AW: Firebird 3.0 - Stored Functions & Schlüsselwort deterministic
Zitat:
SQL-Code:
PERFORM pg_sleep(1000); -- SELECT pg_sleep(1000);
Und für ein billiges schnelles Testen/Debugging kann man es schonmal gebrauchen. (Laufzeit- und Timeout-Tests) Alles mit Jedem verlinken verbrät auch ein klein bissl Zeit. :stupid:
SQL-Code:
SELECT * FROM GrosseTabelleA, GrosseTabelleB, GrosseTabelleC
-- bzw. SELECT * FROM GrosseTabelleA JOIN GrosseTabelleB ON true JOIN GrosseTabelleC ON true ORDER BY 1 LIMIT 1 |
AW: Firebird 3.0 - Stored Functions & Schlüsselwort deterministic
Noch ein Hinweis dazu, falsche DB aber einigermaßen erklärt.
![]() |
AW: Firebird 3.0 - Stored Functions & Schlüsselwort deterministic
Hallo Zusammen,
vielen Dank für eure Ausführungen. Das hilft mir weiter. Gruß Jan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz