1. 根据dba_extents中的rowid分布,来得到需要处理的表的rowid范围以进行手工分区.
01 | CREATE OR REPLACE PROCEDURE get_table_chunk_rowids2 (p_schema VARCHAR2, p_table VARCHAR2, |
02 | p_chunks NUMBER, p_cur_chunk NUMBER, |
03 | p_min_rowid OUT VARCHAR2, p_max_rowid OUT VARCHAR2 |
08 | INTO p_min_rowid, p_max_rowid |
12 | , sys.DBMS_ROWID.rowid_create (1, d.oid, c.fid1, c.bid1, 0) r1 |
13 | , sys.DBMS_ROWID.rowid_create (1, d.oid, c.fid2, c.bid2, 9999) r2 |
17 | OVER ( PARTITION BY b.rn |
19 | ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) fid1, |
21 | OVER ( PARTITION BY b.rn |
23 | ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) fid2, |
25 | DECODE (SIGN (range2 - range1), |
26 | 1, a.bid + ( (b.rn - a.range1) * a.chunks1), |
31 | ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) bid1, |
34 | SIGN (range2 - range1), |
35 | 1, a.bid + ( (b.rn - a.range1 + 1) * a.chunks1) - 1, |
36 | (a.bid + a.blocks - 1))) |
40 | ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) bid2 |
45 | TRUNC ( (sum2 - blocks + 1 - 0.1) / chunks1) range1, |
46 | TRUNC ( (sum2 - 0.1) / chunks1) range2 |
47 | FROM (SELECT /*+ rule */ |
51 | SUM (blocks) OVER () sum1, |
52 | TRUNC ( (SUM (blocks) OVER ()) / p_chunks) chunks1, |
53 | SUM (blocks) OVER (ORDER BY relative_fno, block_id) sum2 |
55 | WHERE segment_name = UPPER (p_table) AND owner = UPPER(p_schema)) |
56 | WHERE sum1 > p_chunks) a, |
57 | ( SELECT ROWNUM - 1 rn |
59 | CONNECT BY LEVEL <= p_chunks) b |
60 | WHERE b.rn BETWEEN a.range1 AND a.range2) c, |
61 | (SELECT MAX (data_object_id) oid |
63 | WHERE object_name = UPPER (p_table) AND owner = UPPER (p_schema) |
64 | AND data_object_id IS NOT NULL) d |
65 | ORDER BY d.oid, c.fid1, c.bid1 |
67 | WHERE q.rn = p_cur_chunk; |
Jonathan Lewis也有类似的想法.
14 | lpad(rownum,10,"0") small_vc, |
26 | where object_name = "T1" |
30 | extent_id, file_id, block_id, blocks |
35 | and segment_name = "T1" |
46 | dbms_rowid.rowid_create( |
52 | dbms_rowid.rowid_create( |
63 | and segment_name = "T1" |
68 | gather_plan_statistics |
79 | t1.rowid between rr.low_rowid and rr.high_rowid |
82 | select * from table(dbms_xplan.display_cursor(null,null,"allstats last")); |
2. 我自己在工作为更新做的手工分任务的方法.
01 | create table batch_job tablespace xxx as |
02 | select mod(rownum,50/* batch size*/) batch_id,id pk_id |
06 | create table batch_status tablespace xxx as |
07 | select batch_id,,0 flag/*imply is this batch processed or not processed*/ |
09 | select distinct batch_id from batch_job |
12 | create batch_job_bid_ind on batch_job(batch_id) tablespace xxx; |
13 | create batch_status_pk on batch_status(batch_id) tablespace xxx; |
15 | create or replace procedure process_batch as |
18 | select batch_id into v_batch_id from batch_status where flag = 0 and rownum <= 1 skip locked; |
19 | for rs in (select xxxx from batch_job a,target_table b where a.pk_id = b.id and a.batch_id = v_batch_id) |
3. 如果你的数据库版本为11g, 可以使用
DBMS_PARALLEL_EXECUTE来拆分任务.在Oracle中跟踪某几个用户的SQLOracle ASM环境下怎么进行数据库冷备相关资讯 oracle
- [INS-32052] Oracle基目录和Oracle (07/22/2014 07:41:41)
- Oracle 4个大对象(lobs)数据类型 (02/03/2013 12:33:05)
- Oracle按时间段分组统计 (07/26/2012 10:36:48)
| - [Oracle] dbms_metadata.get_ddl的 (07/12/2013 07:37:30)
- Liferay Portal 配置使用Oracle和 (07/31/2012 20:07:18)
- Concurrent Request:Inactive (07/20/2012 07:44:05)
|
本文评论 查看全部评论 (0)