SQL não determinístico
Uma instrução SQL é não determinística em um conjunto de replicação se não retornar o mesmo resultado quando executada em todos os nós de replicação do conjunto. Se uma instrução SQL contiver uma expressão não determinística, a replicação por valor da expressão será executada.
Há suporte para atualizações de dados replicados que usam qualquer forma de carimbo de data/hora de declaração (por exemplo, chamadas para a função CURRENT_TIMESTAMP e para a função TIMETZ). Os registros de data e hora da instrução são replicados como literais de cadeia que são avaliados no sistema NPS® primário que executa a consulta. Como os literais são interpretados no fuso horário do primário, se os fusos horários do primário e da réplica forem diferentes, os dois sites terão horários de exibição idênticos que representam horários absolutos ou UTC diferentes. Por exemplo, se o fuso horário do primário estiver definido como EDT, o valor será registrado em EDT. Suponha que o valor seja 4:18 p.m. Se o fuso horário da réplica for PDT, o horário será três horas antes do horário da réplica principal, ou seja, p.m. Manipulando o tempo por valor, o primário envia, e a réplica recebe, o valor de 4:18 p.m, que é diferente do tempo absoluto da réplica.
- A palavra-chave LIMIT
- A expressão NEXT VALUE IN <sequence>
- Agregados definidos pelo usuário (UDAs) e funções de tabela definidas pelo usuário (UDTFs)
- Colunas especiais DatasliceID, RowID, CreateTxID, DeleteTxID, _extentID, e _ pageID ), exceto quando a consulta estiver selecionando de uma tabela com versão
- Funções do sistema visíveis ao usuário que foram detectadas como não determinísticas
- As funções Current_DBID, Current_SID, Current_USERID e Current_USEROID
UDFs, UDAs e não determinismo
As funções definidas pelo usuário (UDFs) são processadas usando a configuração determinística ( --nondet) que você especificou durante o registro da UDF ou para o comando CREATE FUNCTION ou ALTER FUNCTION. Se a função for determinística, a replicação por SQL será aplicada a essa função; se não for determinística, a replicação por valor será escolhida para toda a transação. O uso de um agregado definido pelo usuário (UDA) em uma transação que modifica tabelas não temporárias em um banco de dados replicado sempre aciona a replicação por valor. Uma transação by-SQL se torna uma transação by-value se o software detectar uma única chamada de função não determinística ou uma referência de dados não replicada.
Se você especificar que um UDF é determinístico (não usando a opção --nondet ) e ele não for, a replicação by-SQL será aplicada. No entanto, o primário e a réplica podem apresentar divergência de dados quando o UDF é executado de forma diferente na réplica e no primário. Nesse caso, são necessárias ações de backup e restauração para corrigir o problema. Por esse motivo, se você não tiver certeza de que uma função contém SQL não determinístico, a melhor maneira de agir é aplicar a configuração --nondet no momento do registro. Para obter detalhes completos e exemplos, consulte Funções definidas pelo usuário.
Configurações de visualização não determinísticas
| Nome | Descrição |
|---|---|
| exibição | Indica se a função é visível para o usuário. A verificação SQL não determinística é feita somente em funções visíveis pelo usuário. |
| determinista | Indica se a função é determinística. O otimizador do NPS usa esse sinalizador para escolher um algoritmo de avaliação. O algoritmo de verificação não determinística do SQL faz referência a esse sinalizador, mas não se baseia totalmente nele. Uma função pode passar nesse teste, mas falhar em alguma outra verificação (por exemplo, quando usada em combinação com outra função). Se não for determinística, a função será tratada por valor. |
- Todas as funções visíveis ao usuário com o sinalizador determinístico definido como true, exceto CURRENT_DBID, CURRENT_SID, CURRENT_USERID e CURRENT_USEROID, são determinísticas em um ambiente de replicação. A exceção se aplica a essas quatro funções porque não é garantido que a primária e a réplica tenham as mesmas IDs de objeto.
- Todas as funções visíveis pelo usuário com o sinalizador determinístico definido como false, exceto as funções relacionadas a carimbo de data/hora, são não determinísticas em um ambiente de replicação.
- Todas as funções visíveis ao usuário que retornam uma parte ou uma transformação do carimbo de data/hora da instrução são replicadas e determinísticas em um ambiente de replicação, independentemente do sinalizador determinístico.