@RANGE
Utilice la función @RANGE para dividir las filas de cualquier tabla entre dos o más procesos de Oracle GoldenGate. Se puede utilizar para aumentar el rendimiento de tablas grandes y de gran acceso y también se puede utilizar para dividir los datos en juegos para la distribución a diferentes destinos. Especifique cada rango en una cláusula FILTER en una sentencia TABLE o MAP.
@RANGE es seguro y escalable. Conserva la integridad de los datos al garantizar que la misma fila siempre será procesada por el mismo grupo de procesos. Para asegurarse de que las filas no cambian las particiones a otro grupo de procesos y de que DML se realiza en el orden correcto, la columna en la que se basa la partición @RANGE no debe cambiar nunca durante una ejecución de proceso. Las actualizaciones en la columna de partición pueden provocar errores de "fila no encontrada" o errores de restricción única.
@RANGE calcula un valor hash de las columnas especificadas en la entrada. Si no se especifica ninguna columna, la cláusula KEYCOLS de la sentencia TABLE o MAP se utiliza para determinar las columnas que se van a hash, si existe una cláusula KEYCOLS. De lo contrario, se utilizan las columnas de clave primaria.
Oracle GoldenGate ajusta el número total de rangos para optimizar la distribución uniforme en el número de rangos especificados.
Puesto que se puede especificar cualquier columna para esta función, las filas de tablas con restricciones relacionales se deben agrupar entre sí en el mismo proceso o pista para mantener la integridad referencial.
Nota: El uso de Extract para calcular los rangos es más eficaz que el uso de Replicat. El cálculo de rangos en el lado de destino requiere que Replicat lea toda la pista para encontrar los datos que cumplen con cada especificación de rango.
Sintaxis
@RANGE (<range>, <total_ranges> [, <column>] [, <column>] [, ...])
<range>
Rango asignado al proceso o pista especificados. Los valores válidos son 1, 2, 3, etc., siendo el valor máximo el valor definido por <total_ranges>.
<total_ranges>
Número total de rangos asignados. Por ejemplo, para dividir los datos en tres grupos, utilice el valor 3.
<column>
Nombre de una columna en la que se basará la asignación de rangos. Este argumento es opcional. Si no se utiliza, Oracle GoldenGate asigna rangos según la clave primaria de la tabla.
Los datos no pueden contener columnas faltantes o NULL; esto hará que la función @RANGE finalice de forma anormal.
Las columnas especificadas en una lista de columnas deben existir en el archivo de pista. Puede controlar esto mediante KEYCOLS en Extract para incluir esta columna, o mediante FETCHCOLS en Extract para la columna, o asegurándose de que la columna forma parte del grupo de logs suplementario y, a continuación, mediante LOGALLSUPCOLS.
Ejemplos
Ejemplo 1
En el siguiente ejemplo, la carga de trabajo de replicación se divide en tres rangos (entre tres procesos de Replicat) basados en la columna ID de la tabla acct de origen.
(Archivo de parámetros del grupo 1 de Replicat)
MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (1, 3, ID));
(Archivo de parámetros del grupo 2 de Replicat)
MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (2, 3, ID));
(Archivo de parámetros del grupo 3 de Replicat)
MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (3, 3, ID));
Ejemplo 2
En el siguiente ejemplo, un proceso de extracción divide la carga de proceso en dos pistas. Puesto que no se ha definido ninguna columna en la que basar el cálculo del rango, Oracle GoldenGate utilizará las columnas de clave primaria.
RMTTRAIL /ggs/dirdat/aa
TABLE fin.account, FILTER (@RANGE (1, 2));
RMTTRAIL /ggs/dirdat/bb
TABLE fin.account, FILTER (@RANGE (2, 2));
Ejemplo 3
En el siguiente ejemplo, dos tablas tienen operaciones relativas basadas en una columna order_ID. La tabla order_master tiene una clave de order_ID y la tabla order_detail tiene una clave de order_ID y item_number. Puesto que la clave order_ID establece la relatividad, se utiliza en los filtros @RANGE para ambas tablas con el fin de mantener la integridad referencial. La carga se divide en dos rangos.
(Archivo de Parámetros n.º 1)
MAP sales.order_master, TARGET sales.order_master,
FILTER (@RANGE (1, 2, order_ID));
MAP sales.order_detail, TARGET sales.order_detail,
FILTER (@RANGE (1, 2, order_ID));
(Archivo de Parámetros n.º 2)
MAP sales.order_master, TARGET sales.order_master,
FILTER (@RANGE (2, 2, order_ID));
MAP sales.order_detail, TARGET sales.order_detail,
FILTER (@RANGE (2, 2, order_ID));