Deterministische Funktion in MySQL
Hab ich verwechselt mit einem scheinbar einfachen Konzept. Mysql definiert deterministische Funktion als eine Funktion, die
ergibt immer das gleiche Ergebnis für die gleichen Eingabeparameter
So, in meinem Verständnis, die Funktionen wie
CREATE FUNCTION foo (val INT) READS SQL DATA
BEGIN
DECLARE retval INT;
SET retval = (SELECT COUNT(*) FROM table_1 WHERE field_1 = val);
RETURN retval;
END;
sind nicht deterministisch (es gibt keine Garantie, dass die delete/update/insert nicht zufällig zwischen 2 Funktionsaufrufen). Zur gleichen Zeit, sah ich viele Funktionen, die machen so ziemlich das gleiche, d.h. return-Wert basiert auf dem Ergebnis von Abfragen, und erklärte, wie DETERMINISTIC
. Es sieht aus wie ich bin fehlt etwas sehr Grundsätzliches.
Kann jemand diese Frage klären?
Dank.
Update
Vielen Dank für diejenigen, die Antwort auf(+1); so weit es sieht aus wie es ist eine weit verbreitete Missbrauch von DETERMINISTIC
Schlüsselwort. Es ist immer noch schwer zu glauben für mich, dass so viele Menschen es tun, also werde ich noch ein bisschen warten für die anderen Antworten.
DETERMINISTISCH
und READS SQL DATA
zur gleichen Zeit (und was würde das bedeuten für die Funktion). InformationsquelleAutor der Frage a1ex07 | 2011-10-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der MySQL 5.0 Reference:
So dort haben Sie es, Sie können tag einer gespeicherten routine, wie
DETERMINISTIC
auch wenn Sie es nicht ist, aber es könnte zu unerwarteten Ergebnissen führen oder performance-Probleme.InformationsquelleAutor der Antwort Xint0
DETERMINISTISCHE Ergebnisse beziehen sich nicht auf verschiedene Resultsets zurückgegeben wird, zu unterschiedlichen Zeiten (je nachdem, welche Daten aufgenommen worden in der Zwischenzeit). Es ist zudem ein Verweis auf die Ergebnis-sets auf unterschiedlichen Rechnern mit den gleichen Daten. Wenn zum Beispiel, Sie haben 2 Maschinen, die eine Funktion auszuführen, einschließlich uuid() oder verweisen auf server-Variablen, dann sollten diese als NICHT DETERMINISTISCH. Dies ist nützlich, zum Beispiel bei der Replikation, da die Funktion Anrufe gespeichert sind, in die Binär-log (master) und dann auch ausgeführt, indem der slave. Für details und Beispiele siehe http://dev.mysql.com/doc/refman/5.0/en/stored-programs-logging.html
Den Einsatz DETERMINISTISCH ist, so ist (99% der Zeit) korrekt, nicht als Missbrauch.
InformationsquelleAutor der Antwort Jon Gilbert
Ich denke, dass Sie Ihre routine deterministisch ist. Die Dokumentation ist nicht sehr klar, und dies hat dazu geführt, dass sehr viele Menschen sehr verwirrt über dieses Thema, welches eigentlich mehr über die Replikation als alles andere.
Betrachten Sie eine situation, in der Sie die Replikation zwischen zwei Datenbanken. Die master-Datenbank protokolliert alle gespeicherten Routinen ausgeführt wurden, einschließlich Ihrer input-Parameter, und Schiffe, die dieses Protokoll zu der der slave. Der slave führt die gleiche gespeicherte Routinen in der gleichen Reihenfolge mit den gleichen Eingabe-Parameter. Wird die slave-Datenbank enthalten identische Daten auf die master-Datenbank? Wenn die gespeicherte Routinen erstellen von GUIDs und speichern diese in der Datenbank nicht die master-und slave-Datenbanken wird anders sein und die Replikation unterbrochen wird.
Den Hauptzweck der DETERMINISTISCHEN fahne ist zu sagen, ob MySQL einschließlich der Anrufe über die gespeicherten routine in der Replikation protokollieren, werden Unterschiede zwischen der master-Datenbank und die slaves repliziert, und ist daher unsicher.
Bei der Entscheidung, ob die DETERMINISTISCHE flag geeignet ist für eine gespeicherte routine betrachten Sie es wie folgt: Wenn ich starten mit zwei identischen Datenbanken und führe ich meine routine auf beiden Datenbanken mit dem gleichen input-Parametern wird meine Datenbanken immer noch identisch sein? Wenn Sie dann meine routine deterministisch ist.
Wenn Sie erklären, Ihre routine ist deterministisch, wenn es nicht ist, dann Kopien Ihrer wichtigsten Datenbank möglicherweise nicht identisch mit dem original, weil MySQL wird nur noch die Prozedur aufrufen, um die Replikation protokollieren und die Durchführung der Prozedur auf dem slave nicht produzieren identische Ergebnisse.
Wenn Sie Ihre routine ist nicht-deterministisch, dann MySQL müssen die betroffenen Zeilen in der log Replikation statt. Wenn Sie erklären, Ihre routine als nicht-deterministisch, wenn es nicht dies nicht etwas zu brechen, aber die Replikations-log enthält alle betroffenen Zeilen, wenn nur der Prozeduraufruf genug gewesen wäre, und dies könnte Auswirkungen auf die Leistung.
InformationsquelleAutor der Antwort bikeman868
Du bist an nichts fehlt. Diese Funktion ist nicht-deterministisch. Er erklärt es deterministische wird nicht dazu führen Sie Ihre Datenbank, um zu Schmelzen, aber es könnte die Leistung beeinflussen. Von der MySQL-Seite: "Das erklärt die eine nicht deterministische routine als DETERMINISTISCH könnte zu unerwarteten Ergebnissen führen, da der Optimierer falsche Ausführung planen, Entscheidungen treffen." Aber MySQL nicht erzwingen oder überprüfen Sie, ob Ihre erklärten deterministische routine ist tatsächlich deterministisch---MySQL vertraut, dass Sie wissen, was Sie tun.
InformationsquelleAutor der Antwort John Watson
Deterministisch ist wichtig, wenn Sie die Replikation aktiviert oder kann es eines Tages. Eine nicht-deterministische Funktion aufrufen, die bewirkt, dass eine Zeile ändern (update oder insert) für die Instanz repliziert werden müssen mit binären (row-based), wo als eine deterministische Funktion, die repliziert werden können-Anweisung basiert.
Dies wird dann interessant, wenn man sich die SQL-Beispiele vor, was wird passieren die gleichen (das gleiche Ergebnis), wenn repliziert using-Anweisung basiert, und die repliziert werden soll mit dem Ergebnis der master - (row-based). Wenn die Anweisungen ausgeführt, die mit den entsprechenden sperren und gewährleistet werden kann, führen Sie in der gleichen Reihenfolge auf dem Slave dann sind Sie in der Tat deterministisch. Wenn die Verriegelung /Anweisung, damit der Slave verwendet (keine Parallelität, eine serielle Verarbeitung der Anweisungen in der Reihenfolge, wie Sie gestartet sind) bedeutet, dass die Antwort anders sein kann, dann ist die Funktion nicht deterministisch ist.
InformationsquelleAutor der Antwort dooku