@RANGE

Mit der Funktion @RANGE können Sie die Zeilen einer beliebigen Tabelle auf zwei oder mehr Oracle GoldenGate-Prozesse aufteilen. Es kann verwendet werden, um den Durchsatz von großen und stark zugänglichen Tabellen zu erhöhen und kann auch verwendet werden, um Daten in Sets für die Verteilung an verschiedene Ziele aufzuteilen. Geben Sie jeden Bereich in einer FILTER-Klausel in einer TABLE- oder MAP-Anweisung an.

@RANGE ist sicher und skalierbar. Die Datenintegrität wird erhalten, indem sichergestellt wird, dass derselbe Datensatz immer von derselben Prozessgruppe verarbeitet wird. Um sicherzustellen, dass Zeilen keine Partitionen in eine andere Prozessgruppe verschieben und die DML in der richtigen Reihenfolge ausgeführt wird, darf sich die Spalte, auf der Sie die @RANGE-Partitionierung basieren, während einer Prozessausführung nie ändern. Aktualisierungen der Partitionsspalte können zu Fehlern "Zeile nicht gefunden" oder Unique-Constraint-Fehlern führen.

@RANGE berechnet einen Hashwert der in der Eingabe angegebenen Spalten. Wenn keine Spalten angegeben sind, wird die KEYCOLS-Klausel der TABLE- oder MAP-Anweisung verwendet, um die zu hashenden Spalten zu bestimmen, wenn eine KEYCOLS-Klausel vorhanden ist. Andernfalls werden die Primärschlüsselspalten verwendet.

Oracle GoldenGate passt die Gesamtzahl der Bereiche an, um die gleichmäßige Verteilung über die angegebene Anzahl von Bereichen zu optimieren.

Da alle Spalten für diese Funktion angegeben werden können, müssen Zeilen in Tabellen mit relationalen Constraints zueinander in demselben Prozess oder Trail gruppiert werden, um die referenzielle Integrität zu erhalten.

Hinweis: Die Verwendung von Extract zur Berechnung der Bereiche ist effizienter als die Verwendung von Replicat. Bei der Berechnung von Bereichen auf der Zielseite muss Replicat den gesamten Trail durchlesen, um die Daten zu finden, die den einzelnen Bereichsspezifikationen entsprechen.

Syntax

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

<range>

Der Bereich, der dem angegebenen Prozess oder Trail zugewiesen ist. Gültige Werte sind 1, 2, 3 usw., wobei der Höchstwert der von <total_ranges> definierte Wert ist.

<total_ranges>

Die Gesamtanzahl der zugewiesenen Bereiche. Beispiel: Um Daten in drei Gruppen aufzuteilen, verwenden Sie den Wert 3.

<column>

Der Name einer Spalte, auf der die Bereichszuordnung basieren soll. Dieses Argument ist optional. Wenn sie nicht verwendet werden, weist Oracle GoldenGate Bereiche basierend auf dem Primärschlüssel der Tabelle zu.

Ihre Daten dürfen keine fehlenden oder NULL-Spalten enthalten. Dadurch wird die Funktion @RANGE abgebrochen.

Die in einer Spaltenliste angegebenen Spalten müssen in der Traildatei vorhanden sein. Sie können dies mit KEYCOLS in Extract steuern, um diese Spalte einzuschließen, oder indem Sie FETCHCOLS in Extract für die Spalte verwenden oder indem Sie sicherstellen, dass die Spalte Teil der zusätzlichen Loggruppe ist, und dann LOGALLSUPCOLS verwenden.

Beispiele

Beispiel 1

Im folgenden Beispiel wird die Replikations-Workload basierend auf der Spalte ID der Quelltabelle acct in drei Bereiche (zwischen drei Replicat-Prozessen) aufgeteilt.

(Parameterdatei für Replicat-Gruppe 1)

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

(Parameterdatei für Replicat-Gruppe 2)

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

(Parameterdatei für Replicat-Gruppe 3)

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

Beispiel 2

Im folgenden Beispiel teilt ein Extract-Prozess die Verarbeitungslast in zwei Trails auf. Da keine Spalten definiert wurden, auf denen die Bereichsberechnung basieren soll, verwendet Oracle GoldenGate die Primärschlüsselspalten.

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

Beispiel 3

Im folgenden Beispiel weisen zwei Tabellen relative Vorgänge auf, die auf einer Spalte order_ID basieren. Die Tabelle order_master hat den Schlüssel order_ID, und die Tabelle order_detail hat den Schlüssel order_ID und item_number. Da der Schlüssel order_ID eine Relativität festlegt, wird er in @RANGE-Filtern für beide Tabellen verwendet, um die referenzielle Integrität beizubehalten. Die Last wird in zwei Bereiche aufgeteilt.

(Parameterdatei Nr. 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));

(Parameterdatei Nr. 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));