一、分区表简介

  分区表类型:【范围分区】、【列表分区】 【hash分区】    【这些分区的组合分区】

    范围分区:以某一个范围进行分区。eg:时间段划分。

    列表分区:以某一些几个值进行分区。eg:地区分区,省份进行划分。

    hash分区:以hash算法进行分块。可以有效的消除io的竞争。 更多用在组合分区的子分区中。

    组合分区:11g前仅有两种组合分区  (range- *)      eg: 范围 -列表(月份地区),范围- hash 两种组合

         11g后新增四种。(range-range,list-list,list-hash,list-range) 考虑到兼容性等问题尽量使用 范围开头的组合分区。

  

  使用分区表优点:

    减少访问路径,提升性能外

     更方便的批量操作数据,从而维护方便。

    不同的分区映射到磁盘以平衡I/O,改善整个系统性能。

     相比索引来讲:索引的维护开销是相当大的,它要保证他的有序性,他的数据结构如果乱的话、是需要重组的,而分区表化整为零,大大的减小了扫描范围,同样可以起到很高的效率。

二、分区表实战

  范围分区示例

  
 1 -- 范围分区示例
 2 drop table range_part_tab purge;
 3 --注意,此分区为范围分区
 4 
 5 --例子1
 6 create table range_part_tab (id number,deal_date date,area_code number,nbr number,contents varchar2(4000))
 7            partition by range (deal_date)
 8            (
 9            partition p_201301 values less than (TO_DATE('2013-02-01', 'YYYY-MM-DD')),
10            partition p_201302 values less than (TO_DATE('2013-03-01', 'YYYY-MM-DD')),
11            partition p_201303 values less than (TO_DATE('2013-04-01', 'YYYY-MM-DD')),
12            partition p_201304 values less than (TO_DATE('2013-05-01', 'YYYY-MM-DD')),
13            partition p_201305 values less than (TO_DATE('2013-06-01', 'YYYY-MM-DD')),
14            partition p_201306 values less than (TO_DATE('2013-07-01', 'YYYY-MM-DD')),
15            partition p_201307 values less than (TO_DATE('2013-08-01', 'YYYY-MM-DD')),
16            partition p_201308 values less than (TO_DATE('2013-09-01', 'YYYY-MM-DD')),
17            partition p_201309 values less than (TO_DATE('2013-10-01', 'YYYY-MM-DD')),
18            partition p_201310 values less than (TO_DATE('2013-11-01', 'YYYY-MM-DD')),
19            partition p_201311 values less than (TO_DATE('2013-12-01', 'YYYY-MM-DD')),
20            partition p_201312 values less than (TO_DATE('2014-01-01', 'YYYY-MM-DD')),
21            partition p_201401 values less than (TO_DATE('2014-02-01', 'YYYY-MM-DD')),
22            partition p_201402 values less than (TO_DATE('2014-03-01', 'YYYY-MM-DD')),
23            partition p_max values less than (maxvalue)
24            )
25            ;
26 
27 
28 --以下是插入2013年一整年日期随机数和表示福建地区号含义(591到599)的随机数记录,共有10万条,如下:
29 insert into range_part_tab (id,deal_date,area_code,nbr,contents)
30       select rownum,
31              to_date( to_char(sysdate-365,'J')+TRUNC(DBMS_RANDOM.VALUE(0,365)),'J'),
32              ceil(dbms_random.value(591,599)),
33              ceil(dbms_random.value(18900000001,18999999999)),
34              rpad('*',400,'*')
35         from dual
36       connect by rownum <= 100000;
37 commit;
38 
39 
40 
41 --以下是插入2014年一整年日期随机数和表示福建地区号含义(591到599)的随机数记录,共有10万条,如下:
42 insert into range_part_tab (id,deal_date,area_code,nbr,contents)
43       select rownum,
44              to_date( to_char(sysdate,'J')+TRUNC(DBMS_RANDOM.VALUE(0,365)),'J'),
45              ceil(dbms_random.value(591,599)),
46              ceil(dbms_random.value(18900000001,18999999999)),
47              rpad('*',400,'*')
48         from dual
49       connect by rownum <= 100000;
50 commit;
51 
52 
53 ---添加一个全局索引、一个局部索引后,后面会提到分区操作对索引的影响。
54 create index idx_part_id on range_part_tab (id) ;
55 create index idx_part_nbr on range_part_tab (nbr) local;
56 
57 --统计信息系统一般会自动收集,这只是首次建成表后需要操作一下,以方便测试
58 exec dbms_stats.gather_table_stats(ownname => 'LJB',tabname => 'RANGE_PART_TAB',estimate_percent => 10,method_opt=> 'for all indexed columns',cascade=>TRUE) ;  
59 
60 
61 select min(deal_date),max(deal_date) from range_part_tab;
62 
63 --查看每个分区一共保存了多少条数据
64 select count(*) from range_part_tab partition (p_201301);
65 select count(*) from range_part_tab partition (p_201302);
66 select count(*) from range_part_tab partition (p_201303);
67 select count(*) from range_part_tab partition (p_201304);
68 select count(*) from range_part_tab partition (p_201305);
69 select count(*) from range_part_tab partition (p_201306);
70 select count(*) from range_part_tab partition (p_201307);
71 select count(*) from range_part_tab partition (p_201308);
72 select count(*) from range_part_tab partition (p_201309);
73 select count(*) from range_part_tab partition (p_201310);
74 select count(*) from range_part_tab partition (p_201311);
75 select count(*) from range_part_tab partition (p_201312);
76 select count(*) from range_part_tab partition (p_max);
范围分区sql代码实战,脚本可以直接执行

相关文章: