@RANGE
Utilizzare la funzione @RANGE per dividere le righe di qualsiasi tabella in due o più processi Oracle GoldenGate. Può essere utilizzato per aumentare il throughput di tabelle di grandi dimensioni e a forte accesso e può anche essere utilizzato per dividere i dati in set per la distribuzione a diverse destinazioni. Specificare ogni intervallo in una clausola FILTER in un'istruzione TABLE o MAP.
@RANGE è sicuro e scalabile. Conserva l'integrità dei dati garantendo che la stessa riga venga sempre elaborata dallo stesso gruppo di processi. Per garantire che le righe non spostino le partizioni in un altro gruppo di processi e che DML venga eseguito nell'ordine corretto, la colonna su cui si basa il partizionamento @RANGE non deve mai essere modificata durante l'esecuzione di un processo. Gli aggiornamenti alla colonna della partizione possono generare errori di "riga non trovata" o errori di vincolo univoci.
@RANGE calcola un valore hash delle colonne specificate nell'input. Se non viene specificata alcuna colonna, la clausola KEYCOLS dell'istruzione TABLE o MAP viene utilizzata per determinare le colonne da hash, se esiste una clausola KEYCOLS. In caso contrario, vengono utilizzate le colonne chiave primaria.
Oracle GoldenGate regola il numero totale di intervalli per ottimizzare la distribuzione uniforme tra il numero di intervalli specificati.
Poiché è possibile specificare colonne per questa funzione, le righe nelle tabelle con vincoli relazionali tra loro devono essere raggruppate nello stesso processo o trail per preservare l'integrità referenziale.
Nota: l'utilizzo di Extract per calcolare gli intervalli è più efficiente rispetto all'utilizzo di Replicat. Il calcolo degli intervalli sul lato target richiede che Replicat legga l'intero trail per trovare i dati che soddisfano ogni specifica di intervallo.
Sintassi
@RANGE (<range>, <total_ranges> [, <column>] [, <column>] [, ...])
<range>
Intervallo assegnato al processo o trail specificato. I valori validi sono 1, 2, 3 e così via, mentre il valore massimo è il valore definito da <total_ranges>.
<total_ranges>
Numero totale di intervalli allocati. Ad esempio, per dividere i dati in tre gruppi, utilizzare il valore 3.
<column>
Nome di una colonna su cui basare l'allocazione dell'intervallo. Questo argomento è facoltativo. Se non viene utilizzato, Oracle GoldenGate alloca intervalli in base alla chiave primaria della tabella.
I dati non possono contenere colonne mancanti o NULL, pertanto la funzione @RANGE verrà interrotta.
Le colonne specificate in un elenco di colonne devono esistere nel file trail. È possibile controllarlo utilizzando KEYCOLS nell'estrazione per includere questa colonna oppure utilizzando FETCHCOLS nell'estrazione per la colonna oppure assicurandosi che la colonna faccia parte del gruppo di log supplementare e quindi utilizzando LOGALLSUPCOLS.
Esempi
Esempio 1
Nell'esempio seguente, il carico di lavoro di replica viene suddiviso in tre intervalli (tra tre processi Replicat) in base alla colonna ID della tabella acct di origine.
(file dei parametri Replicat group 1)
MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (1, 3, ID));
(file dei parametri Replicat group 2)
MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (2, 3, ID));
(file dei parametri del gruppo Replicat 3)
MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (3, 3, ID));
Esempio 2
Nell'esempio seguente, un processo Extract divide il carico di elaborazione in due trail. Poiché non è stata definita alcuna colonna su cui basare il calcolo dell'intervallo, Oracle GoldenGate utilizzerà le colonne della chiave primaria.
RMTTRAIL /ggs/dirdat/aa
TABLE fin.account, FILTER (@RANGE (1, 2));
RMTTRAIL /ggs/dirdat/bb
TABLE fin.account, FILTER (@RANGE (2, 2));
Esempio 3
Nell'esempio seguente, due tabelle dispongono di operazioni relative basate su una colonna order_ID. La tabella order_master ha una chiave order_ID e la tabella order_detail ha una chiave order_ID e item_number. Poiché la chiave order_ID stabilisce la relatività, viene utilizzata nei filtri @RANGE per entrambe le tabelle per preservare l'integrità referenziale. Il carico è suddiviso in due intervalli.
(File parametri #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));
(File parametri #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));