@RANGE

@RANGEファンクションでは、表の行を複数のOracle GoldenGateプロセス間に分割します。これを使用して大規模でアクセスの多い表のスループットを向上させることができ、データをセットに分割して異なる宛先への配布を行うこともできます。各範囲は、TABLE文またはMAP文のFILTER句で指定します。

@RANGEは、安全でスケーラブルです。同一行が常に同一のプロセス・グループに処理されることを保証することにより、データの整合性を維持します。行が別のプロセス・グループにパーティションをシフトしないように、また、DMLが正しい順序で実行されるように、@RANGEパーティショニングが基盤とする列は、プロセスの実行中に一切変更することはできません。パーティション列を更新すると、行が見つからないというエラーまたは一意制約エラーが発生する可能性があります。

@RANGEは、入力で指定された列のハッシュ値を計算します。列が指定されない場合、TABLEまたはMAP文にKEYCOLS句が指定されていれば、KEYCOLS句を使用して、ハッシュする列を確認します。それ以外の場合は、主キー列を使用します。

Oracle GoldenGateは、指定された範囲数で均等に分散できるように、合計範囲数を調整します。

このファンクションには任意の列を指定できるため、相互に関係制約を持つ表の行は、参照整合性を維持するために、同一のプロセスまたはトレイルにグループ化する必要があります。

ノート: Extractを使用して範囲を計算する方が、Replicatを使用するよりも効率的です。ターゲット側で範囲を計算するには、Replicatがトレイル全体を読取り、各範囲の指定を満たすデータを見つける必要があります。

構文

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

<range>

指定のプロセスまたはトレイルに割り当てる範囲。<total_ranges>で定義する値を最大値として、1、2、3として指定します。

<total_ranges>

割り当てる範囲の合計数。たとえば、データを3つのグループに分割するには、値3を使用します。

<column>

範囲割当ての基準にする列名。この引数はオプションです。使用されない場合、Oracle GoldenGateは表の主キーに基づいて範囲を割り当てます。

紛失したカラムまたはNULL列がデータに含まれないため、@RANGEファンクションが異常終了します。

列のリストに指定された列は、トレイル・ファイルに存在する必要があります。これを制御するため、ExtractでKEYCOLSを使用してこの列を含めることができます。あるいは、Extractで列に対してFETCHCOLSを使用するか、列をサプリメンタル・ログ・グループに含めてからLOGALLSUPCOLSを使用します。

例

例1

次の例では、レプリケーション・ワークロードは、ソース表acctのID列に基づいて、3つの範囲(3つのReplicatプロセス間)に分割されます。

(Replicatグループ1のパラメータ・ファイル)

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

(Replicatグループ2のパラメータ・ファイル)

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

(Replicatグループ3のパラメータ・ファイル)

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

例2

次の例では、1つのExtractプロセスが処理ロードを2つのトレイルに分割します。範囲計算の基準にする列が定義されていないため、Oracle GoldenGateは主キー列を使用します。

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

例3

次の例では、2つの表でorder_ID列に基づく関連操作が行われます。order_master表は、キーorder_IDを持ち、order_detail表は、キーorder_IDおよびitem_numberを持ちます。キーorder_IDによって相対性が確立されるため、参照整合性を維持するために、両方の表の@RANGEフィルタでこのキーが使用されます。ロードは2つの範囲に分割されます。

(パラメータ・ファイル#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));

(パラメータ・ファイル#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));