Nicht-deterministisches SQL

Eine SQL-Anweisung ist in einem Replikationsset nicht-deterministisch, wenn sie bei Ausführung auf allen Replikationsknoten des Sets nicht das gleiche Ergebnis liefert. Wenn eine SQL-Anweisung einen nicht-deterministischen Ausdruck enthält, wird eine By-Value-Replikation des Ausdrucks durchgeführt.

Aktualisierungen replizierter Daten, die eine beliebige Form von Anweisungszeitstempel verwenden (z. B. Aufrufe der Funktionen CURRENT_TIMESTAMP und TIMETZ), werden unterstützt. Die Zeitstempel der Anweisungen werden als String-Literale repliziert, die auf dem primären NPS®-System ausgewertet werden, das die Abfrage ausführt. Da die Literale in der Zeitzone des primären Standorts interpretiert werden, haben die beiden Standorte identische Anzeigezeiten, die unterschiedliche absolute oder UTC-Zeiten darstellen, wenn sich die Zeitzonen des primären und des replizierenden Standorts unterscheiden. Wenn beispielsweise die Zeitzone der Primärdatei auf EDT eingestellt ist, wird der Wert in EDT aufgezeichnet. Angenommen, der Wert ist 16:18 p.m. Wenn die Zeitzone der Replik PDT ist, ist die Zeit drei Stunden früher als die der primären, also 13:18 p.m. Bei der Handhabung der Zeit nach Wert sendet der Primärserver den Wert 16:18 p.m und der Replikator empfängt ihn, die sich von der absoluten Zeit der Replik unterscheidet.

Die folgenden Positionen werden immer nach Wert repliziert:
  • Das Schlüsselwort LIMIT
  • Der Ausdruck NEXT VALUE IN <sequence>
  • Benutzerdefinierte Aggregate (UDAs) und benutzerdefinierte Tabellenfunktionen (UDTFs)
  • Spezielle Spalten DatasliceID, RowID, CreateTxID, DeleteTxID, _extentID, und _ pageID ), außer wenn die Abfrage aus einer versionierten Tabelle auswählt
  • Für den Benutzer sichtbare Systemfunktionen, die als nicht-deterministisch erkannt wurden
  • Die Funktionen Current_DBID, Current_SID, Current_USERID und Current_USEROID

UDFs, UDAs und Nicht-Determinismus

Benutzerdefinierte Funktionen (UDFs) werden unter Verwendung der deterministischen Einstellung ( --nondet) ) verarbeitet, die Sie bei der UDF-Registrierung oder für den Befehl CREATE FUNCTION oder ALTER FUNCTION angegeben haben. Wenn die Funktion deterministisch ist, wird die by-SQL-Replikation für diese Funktion angewendet; wenn sie nicht deterministisch ist, wird die by-value-Replikation für den gesamten Vorgang gewählt. Die Verwendung eines benutzerdefinierten Aggregats (UDA) in einer Transaktion, die nicht temporäre Tabellen in einer replizierten Datenbank ändert, löst immer eine By-Value-Replikation aus. Eine by-SQL-Transaktion wird zu einer by-value-Transaktion, wenn die Software einen einzelnen nicht-deterministischen Funktionsaufruf oder einen nicht-replizierten Datenverweis entdeckt.

Wenn Sie angeben, dass eine UDF deterministisch ist (indem Sie die Option --nondet nicht verwenden) und dies nicht der Fall ist, wird die by-SQL-Replikation angewendet. Es kann jedoch zu einer Datendivergenz zwischen dem Primär- und dem Replikat kommen, wenn die UDF auf dem Replikat anders ausgeführt wird als auf dem Primärsystem. In diesem Fall sind Sicherungs- und Wiederherstellungsmaßnahmen erforderlich, um das Problem zu beheben. Wenn Sie sich nicht sicher sind, ob eine Funktion nicht-deterministisches SQL enthält, ist es daher am besten, bei der Registrierung die Einstellung --nondet vorzunehmen. Ausführliche Informationen und Beispiele finden Sie unter Benutzerdefinierte Funktionen.

Nicht-deterministische Ansichtseinstellungen

Postgres sind über die Systemansicht _v_function zugänglich. Die folgenden Flags in der Sicht _v_function sind für die Erkennung und Behandlung von nicht-deterministischem SQL relevant.
Tabelle 1. kennzeichen der Ansicht _v_function in Bezug auf den Determinismus
Ihren Namen Beschreibung
Anzeige Gibt an, ob die Funktion für den Benutzer sichtbar ist. Die nichtdeterministische SQL-Prüfung wird nur bei für den Benutzer sichtbaren Funktionen durchgeführt.
deterministisch Gibt an, ob die Funktion deterministisch ist. Der NPS-Optimierer verwendet dieses Kennzeichen, um einen Auswertungsalgorithmus auszuwählen. Der nichtdeterministische SQL-Prüfalgorithmus bezieht sich auf dieses Kennzeichen, basiert aber nicht vollständig darauf. Eine Funktion kann diesen Test bestehen, aber bei einer anderen Prüfung versagen (z. B. wenn sie in Kombination mit einer anderen Funktion verwendet wird). Ist die Funktion nicht deterministisch, wird sie nach dem Wert behandelt.
Es gelten die folgenden weiteren Verhaltensweisen:
  • Alle für den Benutzer sichtbaren Funktionen, bei denen das Determinismus-Flag auf true gesetzt ist, mit Ausnahme von CURRENT_DBID, CURRENT_SID, CURRENT_USERID und CURRENT_USEROID, sind in einer Replikationsumgebung deterministisch. Die Ausnahme gilt für diese vier Funktionen, weil nicht gewährleistet ist, dass Primär- und Replikat dieselben Objekt-IDs haben.
  • Alle für den Benutzer sichtbaren Funktionen, bei denen das Determinismus-Flag auf false gesetzt ist, sind in einer Replikationsumgebung nicht deterministisch, mit Ausnahme der zeitstempelbezogenen Funktionen.
  • Alle für den Benutzer sichtbaren Funktionen, die einen Teil oder eine Transformation des Anweisungszeitstempels zurückgeben, werden in einer Replikationsumgebung repliziert und sind deterministisch, unabhängig vom Determinismus-Flag.