@RANGE

Utilisez la fonction @RANGE pour répartir les lignes d'une table entre plusieurs processus Oracle GoldenGate. Il peut être utilisé pour augmenter le débit des tables volumineuses et très consultées et peut également être utilisé pour diviser les données en ensembles à distribuer vers différentes destinations. Indiquez chaque plage dans une clause FILTER dans une instruction TABLE ou MAP.

@RANGE est sûr et évolutif. Il préserve l'intégrité des données en garantissant que la même ligne sera toujours traitée par le même groupe de traitements. Pour garantir que les lignes ne déplacent pas les partitions vers un autre groupe de processus et que DML est exécuté dans l'ordre approprié, la colonne sur laquelle vous basez le partitionnement @RANGE ne doit jamais changer au cours d'une exécution de processus. Les mises à jour de la colonne de partition peuvent entraîner des erreurs "ligne introuvable" ou des erreurs de contrainte unique.

@RANGE calcule une valeur de hachage des colonnes indiquées dans l'entrée. Si aucune colonne n'est indiquée, la clause KEYCOLS de l'instruction TABLE ou MAP est utilisée pour déterminer les colonnes à hacher, si une clause KEYCOLS existe. Sinon, les colonnes de clé primaire sont utilisées.

Oracle GoldenGate ajuste le nombre total de plages pour optimiser la répartition uniforme sur le nombre de plages indiqué.

Etant donné que des colonnes peuvent être indiquées pour cette fonction, les lignes des tables soumises à des contraintes relationnelles doivent être regroupées dans le même processus ou trace pour préserver l'intégrité référentielle.

Remarque : L'utilisation du processus Extract pour calculer les plages est plus efficace que l'utilisation du processus Replicat. Pour calculer les plages côté cible, le processus Replicat doit lire l'intégralité de la trace afin de trouver les données qui répondent à chaque spécification de plage.

Syntaxe

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

<range>

Fourchette affectée au processus ou à la trace indiqué. Les valeurs valides sont 1, 2, 3, etc., la valeur maximale étant la valeur définie par <total_ranges>.

<total_ranges>

Nombre total de plages allouées. Par exemple, pour diviser les données en trois groupes, utilisez la valeur 3.

<column>

Nom d'une colonne sur laquelle baser l'allocation de plage. Cet argument est facultatif. S'il n'est pas utilisé, Oracle GoldenGate alloue des plages en fonction de la clé primaire de la table.

Vos données ne peuvent pas contenir de colonnes manquantes ou NULL. La fonction @RANGE est alors abandonnée.

Les colonnes indiquées dans une liste de colonnes doivent exister dans le fichier trace. Vous pouvez le contrôler en utilisant KEYCOLS dans le processus Extract pour inclure cette colonne, ou en utilisant FETCHCOLS dans le processus Extract pour la colonne, ou en vous assurant que la colonne fait partie du groupe de journaux supplémentaire, puis en utilisant LOGALLSUPCOLS.

Exemples

Exemple 1

Dans l'exemple suivant, la charge globale de réplication est divisée en trois plages (entre trois processus de réplication) en fonction de la colonne ID de la table acct source.

(Fichier de paramètres du groupe Replicat 1)

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

(Fichier de paramètres du groupe Replicat 2)

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

(Fichier de paramètres du groupe Replicat 3)

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

Exemple 2

Dans l'exemple suivant, un processus Extract divise la charge de traitement en deux traces. Etant donné qu'aucune colonne sur laquelle baser le calcul de plage n'a été définie, Oracle GoldenGate utilisera les colonnes de clé primaire.

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

Exemple 3

Dans l'exemple suivant, deux tables ont des opérations relatives basées sur une colonne order_ID. La table order_master a la clé order_ID et la table order_detail a la clé order_ID et item_number. Etant donné que la clé order_ID établit la relativité, elle est utilisée dans les filtres @RANGE pour les deux tables afin de préserver l'intégrité référentielle. La charge est divisée en deux plages.

(Fichier de paramètres 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));

(Fichier de paramètres 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));