@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>
指定給指定處理或軌跡的範圍。有效值為 1、2、3 等等,最大值為 <total_ranges> 所定義的值。
<total_ranges>
配置的範圍總數。例如,若要將資料分成三個群組,請使用值 3。
<column>
要作為範圍配置基礎的資料欄名稱。這個引數是選擇性的。若未使用,Oracle GoldenGate 會根據表格的主索引鍵配置範圍。
您的資料不能包含遺漏或 NULL 資料欄;這會導致 @RANGE 函數中止。
在資料欄清單中指定的資料欄必須存在於歷程檔中。您可以在「擷取」中使用 KEYCOLS 來控制此資料欄,或者在資料欄的「擷取」中使用 FETCHCOLS,或者確保資料欄是補充日誌群組的一部分,然後使用 LOGALLSUPCOLS。
範例
範例 1
在下列範例中,複製工作負載會根據來源 acct 表格的 ID 資料欄分割成三個範圍 (三個 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
在下列範例中,一個 Extract 處理作業會將處理負載分割成兩個歷程檔。由於未定義作為範圍計算基礎的資料欄,因此 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
在下列範例中,兩個表格具有以 order_ID 資料欄為基礎的相對作業。order_master 表格具有 order_ID 的索引鍵,而 order_detail 表格具有 order_ID 和 item_number 的索引鍵。由於金鑰 order_ID 會建立關係,因此會用於兩個表格的 @RANGE 篩選,以保留參考完整性。負載會分割成兩個範圍。
(參數檔案 #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));