SQL non deterministico

Un'istruzione SQL è non deterministica in un set di replica se non restituisce lo stesso risultato quando viene eseguita su tutti i nodi di replica del set. Se un'istruzione SQL contiene un'espressione non deterministica, viene eseguita la replica per valore dell'espressione.

Sono supportati gli aggiornamenti dei dati replicati che utilizzano qualsiasi forma di marca temporale (ad esempio, le chiamate alla funzione CURRENT_TIMESTAMP e alla funzione TIMETZ). Gli orari delle dichiarazioni sono replicati come letterali di stringa che vengono valutati sul sistema NPS® primario che esegue la query. Poiché i letterali sono interpretati nel fuso orario del primario, se i fusi orari del primario e della replica differiscono, i due siti hanno orari di visualizzazione identici che rappresentano orari assoluti o UTC diversi. Ad esempio, se il fuso orario del primario è impostato su EDT, il valore viene registrato in EDT. Si supponga che il valore sia 16:18 p.m Se il fuso orario della replica è PDT, l'ora è tre ore prima di quella del primario, ovvero le 13.18 p.m Gestendo l'ora in base al valore, il primario invia e la replica riceve il valore di 16:18 p.m che è diverso dal tempo assoluto della replica.

I seguenti elementi sono sempre replicati per valore:
  • La parola chiave LIMIT
  • L'espressione NEXT VALUE IN <sequence>
  • Aggregati definiti dall'utente (UDA) e funzioni di tabella definite dall'utente (UDTF)
  • Colonne speciali DatasliceID, RowID, CreateTxID, DeleteTxID, _extentID, e _ pageID ), tranne quando la query sta selezionando da una tabella versionata
  • Funzioni di sistema visibili dall'utente che sono state rilevate come non deterministiche
  • Le funzioni Current_DBID, Current_SID, Current_USERID e Current_USEROID

UDF, UDA e non-determinismo

Le funzioni definite dall'utente (UDF) vengono elaborate utilizzando l'impostazione deterministica ( --nondet) ) specificata durante la registrazione delle UDF o per il comando CREATE FUNCTION o ALTER FUNCTION. Se la funzione è deterministica, viene applicata la replica by-SQL per quella funzione; se non è deterministica, viene scelta la replica by-value per l'intera transazione. L'uso di un aggregato definito dall'utente (UDA) in una transazione che modifica tabelle non temporanee in un database replicato attiva sempre la replica by-value. Una transazione by-SQL diventa una transazione by-value se il software rileva una singola chiamata di funzione non deterministica o un riferimento ai dati non replicato.

Se si specifica che una UDF è deterministica (non utilizzando l'opzione --nondet ) e non lo è, viene applicata la replica by-SQL. Tuttavia, il primario e la replica potrebbero subire una divergenza di dati quando l'UDF viene eseguita in modo diverso sulla replica rispetto al primario. In questo caso, sono necessarie azioni di backup e ripristino per correggere il problema. Per questo motivo, se non si è sicuri che una funzione contenga SQL non deterministico, la cosa migliore da fare è applicare l'impostazione --nondet al momento della registrazione. Per dettagli ed esempi completi, vedere Funzioni definite dall'utente.

Impostazioni di visualizzazione non deterministiche

Le informazioni sulle funzioni di Postgres sono accessibili dalla vista di sistema _v_function. I seguenti flag all'interno della vista _v_function sono rilevanti per il rilevamento e la gestione di SQL non deterministici.
Tabella 1. flag della vista _v_function relativi al determinismo
Nome Descrizione
visualizzazione Indica se la funzione è visibile all'utente. Il controllo SQL non deterministico viene eseguito solo sulle funzioni visibili all'utente.
deterministici Indica se la funzione è deterministica. L'ottimizzatore NPS utilizza questo flag per scegliere un algoritmo di valutazione. L'algoritmo di controllo SQL non deterministico fa riferimento a questo flag, ma non si basa completamente su di esso. Una funzione potrebbe superare questo test ma fallire in qualche altro controllo (ad esempio, se usata in combinazione con un'altra funzione). Se non è deterministica, la funzione viene gestita per valore.
Si applicano i seguenti altri comportamenti:
  • Tutte le funzioni visibili all'utente con il flag deterministico impostato su true, tranne CURRENT_DBID, CURRENT_SID, CURRENT_USERID e CURRENT_USEROID, sono deterministiche in un ambiente di replica. L'eccezione si applica a queste quattro funzioni perché non è garantito che il primario e la replica abbiano gli stessi ID oggetto.
  • Tutte le funzioni visibili dall'utente con il flag deterministico impostato su false, ad eccezione delle funzioni legate alla marcatura temporale, non sono deterministiche in un ambiente di replica.
  • Tutte le funzioni visibili dall'utente che restituiscono una porzione o una trasformazione della marca temporale dell'istruzione sono replicate e deterministiche in un ambiente di replica, indipendentemente dal flag deterministico.