SQL no determinista
Una sentencia SQL es no determinista en un conjunto de replicación si no devuelve el mismo resultado cuando se ejecuta en todos los nodos de replicación del conjunto. Si una sentencia SQL contiene una expresión no determinista, se realiza una replicación por valor de la expresión.
Se admiten las actualizaciones de datos replicados que utilicen cualquier forma de marca de tiempo de sentencia (por ejemplo, llamadas a la función CURRENT_TIMESTAMP y a la función TIMETZ). Las marcas de tiempo de las sentencias se replican como literales de cadena que se evalúan en el sistema NPS® primario que ejecuta la consulta. Como los literales se interpretan en la zona horaria del primario, si las zonas horarias del primario y de la réplica difieren, los dos sitios tienen horas de visualización idénticas que representan horas absolutas o UTC diferentes. Por ejemplo, si la zona horaria del primario está configurada en EDT, el valor se registra en EDT. Supongamos que el valor es 4:18 p.m Si la zona horaria de la réplica es PDT, la hora es tres horas anterior a la del primario, es decir, p.m 13:18. Manejando la hora por valor, el primario envía, y la réplica recibe, el valor de p.m 16:18, que es diferente del tiempo absoluto de la réplica.
- La palabra clave LIMIT
- La expresión NEXT VALUE IN <sequence>
- Agregados definidos por el usuario (UDA) y funciones de tabla definidas por el usuario (UDTF)
- Columnas especiales DatasliceID, RowID, CreateTxID, DeleteTxID, _extentID,, y _ pageID ), excepto cuando la consulta está seleccionando de una tabla versionada
- Funciones del sistema visibles para el usuario que se detectaron como no deterministas
- Las funciones Current_DBID, Current_SID, Current_USERID y Current_USEROID
UDF, UDA y no determinismo
Las funciones definidas por el usuario (UDF) se procesan utilizando la configuración determinista ( --nondet) que especificó durante el registro de UDF o para el comando CREATE FUNCTION o ALTER FUNCTION. Si la función es determinista, se aplica la replicación by-SQL para esa función; si no es determinista, se elige la replicación by-value para toda la transacción. El uso de un agregado definido por el usuario (UDA) en una transacción que modifica tablas no temporales en una base de datos replicada siempre desencadena la replicación por valor. Una transacción by-SQL se convierte en una transacción by-value si el software detecta cualquier llamada a función no determinista o referencia a datos no replicados.
Si se especifica que una UDF es determinista (no utilizando la opción --nondet ) y no lo es, se aplica la replicación by-SQL. Sin embargo, el primario y la réplica pueden experimentar divergencia de datos cuando la UDF se ejecuta de forma diferente en la réplica que en el primario. En ese caso, se requieren acciones de copia de seguridad y restauración para corregir el problema. Por este motivo, si no está seguro de si una función contiene SQL no determinista, lo mejor es aplicar la configuración --nondet en el momento del registro. Para más detalles y ejemplos, véase Funciones definidas por el usuario.
Ajustes de vista no deterministas
| Nombre | Descripción |
|---|---|
| visualizar | Indica si la función es visible para el usuario. La comprobación SQL no determinista sólo se realiza en las funciones visibles para el usuario. |
| deterministic | Indica si la función es determinista. El optimizador NPS utiliza esta bandera para elegir un algoritmo de evaluación. El algoritmo de comprobación SQL no determinista hace referencia a esta bandera, pero no se basa totalmente en ella. Una función puede superar esta prueba pero fallar en alguna otra comprobación (por ejemplo, cuando se utiliza en combinación con otra función). Si no es determinista, la función se maneja por valor. |
- Todas las funciones visibles para el usuario con el indicador determinista establecido en true, excepto CURRENT_DBID, CURRENT_SID, CURRENT_USERID y CURRENT_USEROID, son deterministas en un entorno de replicación. La excepción se aplica a estas cuatro funciones porque no está garantizado que el primario y la réplica tengan los mismos ID de objeto.
- Todas las funciones visibles para el usuario con el indicador determinista establecido en false, excepto las funciones relacionadas con el sello de tiempo, son no deterministas en un entorno de replicación.
- Todas las funciones visibles para el usuario que devuelven una parte o una transformación de la marca de tiempo de la sentencia son replicadas y deterministas en un entorno de replicación, independientemente de la bandera determinista.