AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Firebird 3.0 - Stored Functions & Schlüsselwort deterministic
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird 3.0 - Stored Functions & Schlüsselwort deterministic

Ein Thema von colaflasche · begonnen am 23. Mai 2017 · letzter Beitrag vom 29. Mai 2017
Antwort Antwort
colaflasche

Registriert seit: 1. Jun 2007
33 Beiträge
 
#1

Firebird 3.0 - Stored Functions & Schlüsselwort deterministic

  Alt 23. Mai 2017, 15:16
Datenbank: Firebird • Version: 3.0 • Zugriff über: Delphi
Hallo Zusammen,

ich habe heute entdeckt, dass man im Firebird 3.0 Stored Functions das Schlüsselwort "Deterministic" mitgeben kann.

Beispiel:
Delphi-Quellcode:
create or alter function SF_CRLF
returns char(2) deterministic
AS
begin
  return ascii_char(13) || ascii_char(10);
end
Ich frage mich nur, was das bedeutet?
Leider bringt mich die Googlesuche nicht sonderlich weit und die ReleaseNotes auch nicht.
Ich finde nur Hinweise darauf, dass man nun per isql auswerten kann, ob es sich um eine deterministic-Funktion handelt, oder nicht.
Und ich habe ein Ticket gefunden, in dem beschrieben wird, dass das nur bei Funktionen Sinn ergibt, die

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
Gruß Jan
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Firebird 3.0 - Stored Functions & Schlüsselwort deterministic

  Alt 23. Mai 2017, 15:52
Laut : https://ib-aid.com/en/articles/45-wa...bird-database/

Zitat:
39. Mark appropriate PSQL functions as DETERMINISTIC
Mark your PSQL functions (in Firebird 3+) which do not have parameters and return constant values with keyword DETERMINISTIC. The deterministic functions are calculated and cached in the scope of the current query.
getestet habe ich das nicht, ist aber je nach bedarf bestimmt interessant....
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Firebird 3.0 - Stored Functions & Schlüsselwort deterministic

  Alt 23. Mai 2017, 16:03
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.
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:
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)
anderes Beispiel:
IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF
https://www.postgresql.org/docs/curr...efunction.html
$2B or not $2B

Geändert von himitsu (23. Mai 2017 um 16:24 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Firebird 3.0 - Stored Functions & Schlüsselwort deterministic

  Alt 23. Mai 2017, 16:34
Zitat:
Sleep(1000); -- k.A. wie man das in FB macht
Sleep in einer SP
Markus Kinzler
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: Firebird 3.0 - Stored Functions & Schlüsselwort deterministic

  Alt 23. Mai 2017, 16:59
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Firebird 3.0 - Stored Functions & Schlüsselwort deterministic

  Alt 23. Mai 2017, 18:59
Sleep in einer SP
Andere können das doch auch?
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.
SQL-Code:
SELECT * FROM GrosseTabelleA, GrosseTabelleB, GrosseTabelleC
-- bzw.
SELECT *
FROM GrosseTabelleA
JOIN GrosseTabelleB ON true
JOIN GrosseTabelleC ON true

ORDER BY 1
LIMIT 1
$2B or not $2B
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: Firebird 3.0 - Stored Functions & Schlüsselwort deterministic

  Alt 24. Mai 2017, 07:44
Noch ein Hinweis dazu, falsche DB aber einigermaßen erklärt.
https://msdn.microsoft.com/de-de/library/ms178091.aspx
Gruß, Jo
  Mit Zitat antworten Zitat
colaflasche

Registriert seit: 1. Jun 2007
33 Beiträge
 
#8

AW: Firebird 3.0 - Stored Functions & Schlüsselwort deterministic

  Alt 29. Mai 2017, 12:50
Hallo Zusammen,

vielen Dank für eure Ausführungen.

Das hilft mir weiter.

Gruß Jan
Gruß Jan
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz