SQL non déterministe

Une instruction SQL est non déterministe dans un ensemble de réplication si elle ne renvoie pas le même résultat lorsqu'elle est exécutée sur tous les nœuds de réplication de l'ensemble. Si une instruction SQL contient une expression non déterministe, la réplication par valeur de l'expression est effectuée.

Les mises à jour des données répliquées qui utilisent n'importe quelle forme d'horodatage (par exemple, les appels à la fonction CURRENT_TIMESTAMP et à la fonction TIMETZ) sont prises en charge. Les horodatages des relevés sont répliqués sous forme de chaînes de caractères littérales qui sont évaluées sur le système NPS® principal qui exécute la requête. Comme les littéraux sont interprétés dans le fuseau horaire du primaire, si les fuseaux horaires du primaire et du réplica sont différents, les deux sites ont des heures d'affichage identiques qui représentent des heures absolues ou UTC différentes. Par exemple, si le fuseau horaire du primaire est réglé sur EDT, la valeur est enregistrée en EDT. Supposons que la valeur soit de 16 h 18 p.m Si le fuseau horaire de la réplique est PDT, l'heure est avancée de trois heures par rapport à celle du primaire, soit 13 p.m 18. En traitant le temps par valeur, le primaire envoie et le réplica reçoit la valeur de 16 p.m 18, qui est différent du temps absolu de la réplique.

Les éléments suivants sont toujours reproduits en fonction de leur valeur :
  • Le mot-clé LIMIT
  • L'expression NEXT VALUE IN <sequence>
  • Agrégats définis par l'utilisateur (UDA) et fonctions de table définies par l'utilisateur (UDTF)
  • Colonnes spéciales DatasliceID, RowID, CreateTxID, DeleteTxID, _extentID, et _ pageID ), sauf si la requête sélectionne une table versionnée
  • Fonctions du système visibles par l'utilisateur qui ont été détectées comme non déterministes
  • Les fonctions Current_DBID, Current_SID, Current_USERID et Current_USEROID

UDF, UDA et non-déterminisme

Les fonctions définies par l'utilisateur (UDF) sont traitées en utilisant le paramètre déterministe ( --nondet) ) que vous avez spécifié lors de l'enregistrement de l'UDF ou pour la commande CREATE FUNCTION ou ALTER FUNCTION. Si la fonction est déterministe, la réplication by-SQL est appliquée pour cette fonction ; si elle n'est pas déterministe, la réplication by-value est choisie pour l'ensemble de la transaction. L'utilisation d'un agrégat défini par l'utilisateur (UDA) dans une transaction qui modifie des tables non temporaires dans une base de données répliquée déclenche toujours une réplication par valeur. Une transaction by-SQL devient une transaction by-value si le logiciel détecte un seul appel de fonction non déterministe ou une référence de données non répliquée.

Si vous spécifiez qu'un UDF est déterministe (en n'utilisant pas l'option --nondet ) et qu'il ne l'est pas, la réplication by-SQL est appliquée. Toutefois, les données peuvent diverger entre le serveur principal et la réplique lorsque l'UDF s'exécute différemment sur la réplique et sur le serveur principal. Dans ce cas, des actions de sauvegarde et de restauration sont nécessaires pour corriger le problème. C'est pourquoi, si vous n'êtes pas sûr qu'une fonction contienne du code SQL non déterministe, la meilleure solution consiste à appliquer le paramètre --nondet lors de l'enregistrement. Pour plus de détails et d'exemples, voir Fonctions définies par l'utilisateur.

Paramètres de vue non déterministes

Les informations sur les fonctions Postgres sont accessibles à partir de la vue système _v_function. Les indicateurs suivants de la vue _v_function sont pertinents pour la détection et la gestion des SQL non déterministes.
Tableau 1. drapeaux de la vue _v_function relatifs au déterminisme
Nom Descriptif
affichage Indique si la fonction est visible par l'utilisateur. Le contrôle SQL non déterministe n'est effectué que sur les fonctions visibles par l'utilisateur.
déterministes Indique si la fonction est déterministe. L'optimiseur NPS utilise cet indicateur pour choisir un algorithme d'évaluation. L'algorithme de vérification SQL non déterministe fait référence à cet indicateur, mais n'est pas entièrement basé sur lui. Une fonction peut réussir ce test mais échouer à un autre contrôle (par exemple, lorsqu'elle est utilisée en combinaison avec une autre fonction). Si elle n'est pas déterministe, la fonction est traitée par valeur.
Les autres comportements suivants s'appliquent :
  • Toutes les fonctions visibles par l'utilisateur dont l'indicateur déterministe a la valeur true, à l'exception de CURRENT_DBID, CURRENT_SID, CURRENT_USERID et CURRENT_USEROID, sont déterministes dans un environnement de réplication. L'exception s'applique à ces quatre fonctions car il n'est pas garanti que le primaire et le réplica aient les mêmes ID d'objet.
  • Toutes les fonctions visibles par l'utilisateur dont l'indicateur déterministe est fixé à false, à l'exception des fonctions liées à l'horodatage, sont non déterministes dans un environnement de réplication.
  • Toutes les fonctions visibles par l'utilisateur qui renvoient une partie ou une transformation de l'horodatage de la déclaration sont répliquées et déterministes dans un environnement de réplication, quel que soit l'indicateur déterministe.