根据rowid 并行执行

Posted by Vincent on September 12, 2008

使用rowid模拟并行执行,用户大数据量的迁移

获取创建rowid需要的信息(data_object_id, relative_fno, block_id)
[cc lang="sql"]select o.data_object_id,
e.RELATIVE_FNO,
e.BLOCK_ID MIN_BLOCK,
e.BLOCK_ID + e.BLOCKS - 1 MAX_BLOCK
from dba_extents e, dba_objects o
where e.segment_name = 'USERS_EXTRA'
AND o.object_name = 'USERS_EXTRA'
and o.data_object_id is not null

获取一个block的rowid_min & rowid_max,
dbms_rowid.rowid_create(1,
data_object_id,
RELATIVE_FNO,
MIN_BLOCK,
0) rowid_min,
dbms_rowid.rowid_create(1,
data_object_id,
RELATIVE_FNO,
MAX_BLOCK,
10000) rowid_max

创建一个完整的包含rowid的临时表
create table tmp_xf_rowid_db1 as
select dbms_rowid.rowid_create(1,
data_object_id,
RELATIVE_FNO,
MIN_BLOCK,
0) rowid_min,
dbms_rowid.rowid_create(1,
data_object_id,
RELATIVE_FNO,
MAX_BLOCK,
10000) rowid_max
from (select o.data_object_id,
e.RELATIVE_FNO,
e.BLOCK_ID MIN_BLOCK,
e.BLOCK_ID + e.BLOCKS - 1 MAX_BLOCK
from dba_extents e, dba_objects o
where e.segment_name = 'USERS_EXTRA'
AND o.object_name = 'USERS_EXTRA'
and o.data_object_id is not null)

-----给临时表增加序列号 ----
alter table tmp_xf_rowid_db1 add (id number);
-------------增加序列数据-----------

declare
i number := 1;
begin
for c in (select t1.rowid_min from tmp_xf_rowid_db1 t1) loop
update tmp_xf_rowid_db1 t2 set id = i
where t2.rowid_min = c.rowid_min;
i := i + 1;
if mod(i, 10) = 0 then
commit;
end if;
end loop;
commit;
end;

--验证序列
alter table tmp_xf_rowid_db1
add constraint pk_tmp_xf_rowid_db1 primary key (ID) using index;[/cc]

---创建临时表 tmp_xf_fb_all_sum 存储汇总信息

[cc lang="sql"]create table tmp_xf_fb_all_sum
as select * from auction_feedback_all_sum where 1=0;
[/cc]
---创建并行执行的存储过程 SP_FB_ALLSUM_DB1
[cc lang="sql"]create or replace procedure SP_FB_ALLSUM_DB1(n number) is
i number := 0;
begin
for c in (select * from tmp_xf_rowid_db1 where mod(id,4)=n ) loop
insert into tmp_xf_fb_all_sum
......
......
where b.rowid between c.rowid_min and c.rowid_max;
i := i + 1;
if mod(i, 10) = 0 then
commit;
end if;
end loop;
commit;
end SP_FB_ALLSUM_DB1;
[/cc]
--------------
--在多个session分别执行
exec SP_FB_ALLSUM_DB1(0);
exec SP_FB_ALLSUM_DB1(1);
exec SP_FB_ALLSUM_DB1(2);
exec SP_FB_ALLSUM_DB1(3);

参考资料:
http://www.orawh.com/54.html
http://blog.itpub.net/post/48/22612
[cc lang="sql"]
function ROWID_CREATE(rowid_type IN number,
object_number IN number,
relative_fno IN number,
block_number IN number,
row_number IN number)
return ROWID;
-- rowid_type - 类型(restricted=0/extended=1)
-- object_number - 对象号
-- relative_fno - relative file number
-- block_number - 文件包含的block号

-- row_number - block中的行的行号
[/cc]
================

取rowid的语句:[cc lang="sql"]
select extent_id,
dbms_rowid.rowid_create(1, data_object_id, relative_fno, block_id, 0) s,
dbms_rowid.rowid_create(1,
data_object_id,
relative_fno,
block_id + blocks - 1,
10000) e
from (select extent_id,
relative_fno,
block_id,
blocks,
nvl(partition_name, 'default') partition_name
from dba_extents
where segment_name = upper('TC_BIZ_ORDER')
and owner = upper('TBCENTER')) a,
(select nvl(subobject_name, 'default') subobject_name, data_object_id
from dba_objects
where object_name = upper('TC_BIZ_ORDER')
and owner = upper('TBCENTER')) b
where a.partition_name = b.subobject_name
[/cc]

-- EOF --


This work is licensed under a CC A-S 4.0 International License.