Oracle goldengate复制@range 作用详解:
使用该@RANGE函数跨两个或更多Oracle GoldenGate进程划分任何表的行。它可以用来增加大量访问量大的表的吞吐量,也可以用来将数据划分成集合以分发到不同的目的地。FILTER在a TABLE或者MAP语句的子句中指定每个范围。
@RANGE是安全和可扩展的。它保证了数据的完整性,保证同一行总是由同一个进程组来处理。为确保行不会将分区转移到另一个进程组,并且DML按照正确的顺序执行,@RANGE在进行运行期间,基于分区的列不得更改。对分区列的更新可能会导致“找不到行”错误或唯一约束错误。
@RANGE计算输入中指定的列的哈希值。如果没有指定列,则使用or 语句的KEYCOLS子句来确定要散列的列(如果存在子句)。否则,使用主键列。TABLEMAPKEYCOLS
Oracle GoldenGate会调整总数范围,以便在指定范围内优化均匀分布。
由于可以为此函数指定任何列,因此必须将具有相互约束约束的表中的行组合到同一个进程或路径中,以保持参照完整性。
注意:
使用Extract来计算范围比使用Replicat更有效。在目标侧计算范围需要Replicat读取整个轨迹以查找符合每个范围规格的数据。
句法
@RANGE(range,total_ranges [,column ] [,column ] [,…])
range
分配给指定进程或跟踪的范围。有效值是1,2,3,等等,具有最大值是由下式定义的值total_ranges。
total_ranges
分配的范围总数。例如,要将数据分成三组,请使用该值3。
column
范围分配所基于的列的名称。这个参数是可选的。如果不使用,则Oracle GoldenGate根据表的主键分配范围。
例子
例1
在以下示例中,基于ID源acct表的列将复制工作负载分成三个范围(在三个Replicat进程之间)。
(复制组1参数文件)
MAP sales.acct,TARGET sales.acct,FILTER(@RANGE(1,3,ID));
(复制组2参数文件)
MAP sales.acct,TARGET sales.acct,FILTER(@RANGE(2,3,ID));
(复制组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表的key order_ID,和order_detail表的key 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));
版权声明:本文为博主原创文章,未经博主允许不得转载。
Oracle goldengate复制@range 作用详解: