3.2 @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));
親トピック: 列変換ファンクション