ata_object_id is not null) d
/
例如,输出10个ROWID切片,我们想要进行DELETE,UPDATE等等,只需要修改一下SQL,同时运行10个SQL即可。
'WHEREROWIDBETWEEN'''||SYS.DBMS_ROWID.ROWID_CREATE(1,D.OID,C.FID1,
------------------------------------------------------------------
where rowid between 'AAASSdAAEAAAAIIAAA' and 'AAASSdAAEAAAALqCcP';
where rowid between 'AAASSdAAEAAAALrAAA' and 'AAASSdAAEAAAANyCcP';
where rowid between 'AAASSdAAEAAAANzAAA' and 'AAASSdAAEAAAAPyCcP';
where rowid between 'AAASSdAAEAAAAPzAAA' and 'AAASSdAAEAAAARyCcP';
where rowid between 'AAASSdAAEAAAARzAAA' and 'AAASSdAAEAAAATyCcP';
where rowid between 'AAASSdAAEAAAATzAAA' and 'AAASSdAAEAAAAVyCcP';
where rowid between 'AAASSdAAEAAAAVzAAA' and 'AAASSdAAEAAAAXyCcP';
where rowid between 'AAASSdAAEAAAAXzAAA' and 'AAASSdAAEAAAAZyCcP';
where rowid between 'AAASSdAAEAAAAZzAAA' and 'AAASSdAAEAAAAbyCcP';
where rowid between 'AAASSdAAEAAAAbzAAA' and 'AAASSdAAEAAAAdlCcP';
10 rows selected.
上面脚本不能用于分区表,而且有时候我们需要delete,update的数据其实只占据表总行数的30%,利用上面脚本要做很多无用功
可以利用下面脚本
select count(*) total_rows from scott.test 带上where条件; ---求出要DELETE,UPDATE的总行数,然后运行下面SQL,输入总行数,ROWID分片数
select 'where rowid >= ''' || rid || ''' and rowid < ''' || lead(rid, 1,rid) over(order by rid) || ''';'
from (select rn, rid
from (select rownum rn, rowid rid, count(*) over() total_rows
from scott.test 带上where条件
order by rowid)
where rn in (select trunc(&&total_rows / level)
from dual
connect by level <= &&level
union
select 1 from dual));
结果类似如下:
'WHEREROWID>='''||RID||'''ANDROWID<'''||LEAD(RID,1,RID)OVER(ORDERBYRID
----------------------------------------------------------------------
where rowid >= 'AAASSdAAEAAAAILAAA' and rowid < 'AAASSdAAEAAAAJuAAB';
where rowid >= 'AAASSdAAEAAAAJuAAB' and rowid < 'AAASSdAAEAAAAJ5AAm';
where rowid >= 'AAASSdAAEAAAAJ5AAm' and rowid < 'AAASSdAAEAAAAKGAA2';
where rowid >= 'AAASSdAAEAAAAKGAA2' and rowid < 'AAASSdAAEAAAAMRAAU';
where rowid >= 'AAASSdAAEAAAAMRAAU' and rowid < 'AAASSdAAEAAAAMoAAq';
where rowid >= 'AAASSdAAEAAAAMoAAq' and rowid < 'AAASSdAAEAAAANKAAo';
where rowid >= 'AAASSdAAEAAAANKAAo' and rowid < 'AAASSdAAEAAAAOCAAb';
where rowid >= 'AAASSdAAEAAAAOCAAb' and rowid < 'AAASSdAAEAAAAPbAAS';
where rowid >= 'AAASSdAAEAAAAPbAAS' and rowid < 'AAASSdAAEAAAASOAA6';
where rowid >= 'AAASSdAAEAAAASOAA6' and rowid < 'AAASSdAAEAAAAaiAAE';
where rowid >= 'AAASSdAAEAAAAaiAAE' and rowid < 'AAASSdAAEAAAAaiAAE'; ----最后一个ROWID 需要改一下,把<改写为<=
11 rows selected.
然后自己带入条件,在多个SESSION运