分段表rowid_rowid分区分段提交

drop type get_type;

/

drop type v_get_type;

/

create  type get_type as object(v_sta varchar2(40),v_end varchar2(40));

/

create  type v_get_type is table of get_type;

/

create or replace function get_rowid(v_owner in varchar2,v_tab_name in varchar2,v_row in number)

return v_get_type

pipelined is

r_get_type get_type :=get_type(null,null);

v_pie number;

V_ALL NUMBER;

begin

EXECUTE IMMEDIATE 'SELECT COUNT(1) FROM  '||UPPER(v_owner)||'.'||UPPER(v_tab_name) INTO V_ALL;

v_pie := CEIL(V_ALL/v_row);

for x in (

select dbms_rowid.rowid_create

( 1, data_object_id, lo_fno, lo_block, 0 ) min_rid,

dbms_rowid.rowid_create

( 1, data_object_id, hi_fno, hi_block, 10000 ) max_rid

from (

select distinct grp,

first_value(relative_fno)

over (partition by grp order by relative_fno, block_id

rows between unbounded preceding and unbounded following) lo_fno,

first_value(block_id )

over (partition by grp order by relative_fno, block_id

rows between unbounded preceding and unbounded following) lo_block,

last_value(relative_fno)

over (partition by grp order by relative_fno, block_id

rows between unbounded preceding and unbounded following) hi_fno,

last_value(block_id+blocks-1)

over (partition by grp order by relative_fno, block_id

rows between unbounded preceding and unbounded following) hi_block,

sum(blocks) over (partition by grp) sum_blocks

from (

select relative_fno,

block_id,

blocks,

trunc( (sum(blocks) over (order by relative_fno, block_id)-0.01) /

(sum(blocks) over ()/v_pie) ) grp

from dba_extents

where segment_name = upper(v_tab_name)

and owner = upper(v_owner) order by block_id

)

),

(select data_object_id

from DBA_OBJECTS where object_name = upper(v_tab_name)

and owner = upper(v_owner)

)

)

loop

r_get_type.v_sta :=x.min_rid  ;

r_get_type.v_end :=x.max_rid;

PIPE ROW(r_get_type);

end loop;

return;

end;

/

select * from table(get_rowid('SYS','GH1',40000));

create table nb as

select * from table(get_rowid('SYS','GH1',40000));

select count(1) from gh1

,nb

where gh1.rowid between v_sta and v_end ;

这些天网友经常问大表如何高效的分片delete,分片update等问题,主要是针对大表的dml分段,现在根据tom的脚本编写了个函数并范例如上,贡献给各位网友。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值