化整为零访问大表的三种方式

Tuesday, January 12th, 2010

业务场景:
表xngul 大小大于 100G。
上面有(id)是number型自增字段,且是pk。
现在有需求要对这个表进行全表扫描,如果直接 select * from xngul, 则至少要半个小时,
而且一次性返回数据过多,应用程序无法处理。
所以想了办法化整为零,将这个表分段,分段读取。
有以下三种方式。
*******I.两个步骤,一个取分段的头尾,一个按头尾取分段内数据。*********
–取分段的头尾
select min(id) as min_id,
 max(id) as max_id
from
 (select /*+index (xngul xngul_pk)*/id
 from xngul
 where id > :last_max_id
 order by id)
where rownum <= :page_size;
–按头尾取中间的数据
select *
from xngul
where id between :min_id and :max_id;
**********************************************************************
————————————————————————————-
**************II.一个步骤,完成分段和取数据。*************************
–在一个sql中完成分段和取数据
select /*+ordered use_nl(b)*/
 b.*
from
 (select id
 from
  (select /*+index (xngul xngul_pk)*/id
  from xngul
  where id > :last_max_id
  order by id) a
 where rownum <= :page_size) a, xngul b
where a.id=b.id;
**********************************************************************
————————————————————————————-
********III.借助一个表,实现多个进程并发处理。************************
–将分段数据记录到表中,并给每个段赋予一个 batch_id 和 batch_status
insert [...]

阿里巴巴DBA出品