oracle 写法:
select * from (
select test.*,rownum rn from test )
where mod(rn,${Internal.Step.Unique.Count})= ${Internal.Step.Unique.Number}
pg 写法:
select * from (
select row_number() over() as rownum,* from customer ) a
where mod(rownum,${Internal.Step.Unique.Count})= ${Internal.Step.Unique.Number}
表输入和表输出开启多线程
表输入如果开启多线程的话,会导致数据重复。比如 :
select * from test ,起3个线程,就会查3遍,最后的数据就是3份。肯定不行,没达到优化的目的。
因为source是oracle,利用oracle的特性: rownum 和函数: mod ,以及kettle的参数: Internal.Step.Unique.Count,Internal.Step.Unique.Number
rownum 是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,意味着,如果排序字段或者数据有变化的话,rownum也会变(也就是跟物理数据没有对应关系,如果要对应关系的话,应该用rowid,但是rowid不是数字,而是类似 AAAR3sAAEAAAACXAAA 的编码),所以需要对rownum进行固化,所以将
SELECT test.*,rownum rn FROM test 作为子查询
mod 是oracle的取模运算函数,比如, mod(5,3) 意即 5%3=2 ,就是 5/3=1...2 中的2,也就是如果能获取到总线程数,以及当前线程数,取模,就可以对结果集进行拆分了。 mod(行号,总线程数)=当前线程序号
kettle 内置函数 ${Internal.Step.Unique.Count} 和 ${Internal.Step.Unique.Number} 分别代表线程总数和当前线程序号
而表输出就无所谓了,开多少线程,kettle都会求总数然后平摊的。
右键选择表输入或者表输出,选择 改变开始复制的数量... 注意,不是一味的调大就一定能提升效率,要进行测试的。
表输入时,注意勾选替换变量
Kettle 表输入表输出提升10倍的技巧
于 2023-12-04 22:49:42 首次发布