@RANGE

Use a função @RANGE para dividir as linhas de qualquer tabela entre dois ou mais processos do Oracle GoldenGate. Ele pode ser usado para aumentar a taxa de transferência de tabelas grandes e altamente acessadas e também pode ser usado para dividir dados em conjuntos para distribuição para diferentes destinos. Especifique cada intervalo em uma cláusula FILTER em uma instrução TABLE ou MAP.

O @RANGE é seguro e escalável. Ela preserva a integridade dos dados, garantindo que a mesma linha sempre seja processada pelo mesmo grupo de processos. Para garantir que as linhas não mudem as partições para outro grupo de processos e que o DML seja executado na ordem correta, a coluna na qual você baseia o particionamento @RANGE nunca deve ser alterada durante a execução de um processo. As atualizações na coluna de partição podem resultar em erros de "linha não encontrada" ou erros de restrição exclusiva.

@RANGE calcula um valor de hash das colunas especificadas na entrada. Se nenhuma coluna for especificada, a cláusula KEYCOLS da instrução TABLE ou MAP será usada para determinar as colunas a serem hash, se existir uma cláusula KEYCOLS. Caso contrário, as colunas de chave primária serão usadas.

O Oracle GoldenGate ajusta o número total de intervalos para otimizar a distribuição uniforme entre o número de intervalos especificados.

Como é possível especificar colunas para essa função, as linhas das tabelas com constraints relacionais entre si devem ser agrupadas no mesmo processo ou trilha para preservar a integridade referencial.

Observação: o uso do Extract para calcular os intervalos é mais eficiente do que o uso do Replicat. O cálculo de intervalos no lado de destino exige que o Replicat leia toda a trilha para localizar os dados que atendem a cada especificação de intervalo.

Sintaxe

@RANGE (<range>, <total_ranges> [, <column>] [, <column>] [, ...])

<range>

O intervalo atribuído ao processo ou trilha especificada. Os valores válidos são 1, 2, 3 e assim por diante, com o valor máximo sendo o valor definido por <total_ranges>.

<total_ranges>

O número total de intervalos alocados. Por exemplo, para dividir dados em três grupos, use o valor 3.

<column>

O nome de uma coluna na qual a alocação do intervalo será baseada. Esse argumento é opcional. Se não for usado, o Oracle GoldenGate alocará intervalos com base na chave primária da tabela.

Seus dados não podem conter colunas ausentes ou NULL; isso fará com que a função @RANGE seja abendida.

As colunas especificadas em uma lista de colunas devem existir no arquivo de trilha. Você pode controlar isso usando KEYCOLS no Extract para incluir essa coluna, ou usando FETCHCOLS no Extract para a coluna ou garantindo que a coluna faça parte do grupo de logs complementares e, em seguida, usando LOGALLSUPCOLS.

Exemplos

Exemplo 1

No exemplo a seguir, a carga de trabalho de replicação é dividida em três intervalos (entre três processos de Replicat) com base na coluna ID da tabela acct de origem.

(arquivo de parâmetros Replicat group 1)

MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (1, 3, ID));

(Arquivo de parâmetros do grupo 2 de replicação)

MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (2, 3, ID));

(arquivo de parâmetros Replicat group 3)

MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (3, 3, ID));

Exemplo 2

No exemplo a seguir, um processo Extract divide a carga de processamento em duas trilhas. Como nenhuma coluna foi definida para basear o cálculo do intervalo, o Oracle GoldenGate usará as colunas de chave primária.

RMTTRAIL /ggs/dirdat/aa
TABLE fin.account, FILTER (@RANGE (1, 2));
RMTTRAIL /ggs/dirdat/bb
TABLE fin.account, FILTER (@RANGE (2, 2));

Exemplo 3

No exemplo a seguir, duas tabelas têm operações relativas com base em uma coluna order_ID. A tabela order_master tem uma chave order_ID e a tabela order_detail tem uma chave order_ID e item_number. Como a chave order_ID estabelece a relatividade, ela é usada em filtros @RANGE para ambas as tabelas para preservar a integridade referencial. A carga é dividida em dois intervalos.

(Arquivo de parâmetro #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));

(Arquivo de parâmetro #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));