Oracle表的分区

一  表分区介绍:

表分区是日常开发中最常用的技术,主要针对于大数据量、颊繁查询数据等需求,有了表分区,我们可以对表进行区间的拆分和组织,提高查询的效率。一般来讲,oracle表分区的一个区间数据最好不大于500W条,也就是说,500W条数据左右可以划分为一个区间,根据实际业务需求和表分区的性能而定。

oracle11g提供了7种分区,功能非常强大,基本满足我们开发的90%以上的需求,作为一个优秀的高程/架构方向的程序员,一定要对数据库存储的概念非常透彻,即使是我们使用mysql也会有类似的分区技术,早期mysq|多用于水平和垂直"分区",拆表拆字段的形式。

  range分区

  hash分区

  list分区

  复合分区

  间隔分区

  system分区

 

二  range分区

range分区就是区域分区,按照定义的区域,进行划分。

语法:

  create table (...)

    partition by range (feld) (

    partition p1 values less than(value),

    partition p2 values less than(value),

    partition p3 values less than(value)

  );  --小于某一个范围内做一个分区

查看分区情况: select * from user_ tab_ partitions;

查看分区数据: select * from table partition(p1);

修改分区:

  添加: alter table table_name add partition p4 values less than(maxvalue);

  删除: alter table table_name drop partition p4;

更新数据时操作时不可以跨分区操作,会出现错误,需要设置可移动的分区才能进行跨分区查询。

  alter table tablename enable row movement;

 

三  分区索引

分区之后虽然可以提高查询的效率,但也仅仅是提高了数据的范围,所以我们在有必要的情况下,需要建立分区索引从而进步提高效率。

分区索引大体上分俩大类,一类叫做local, 一类叫做global.

local:在每个分区上建立素引。

global: 一种是在全局上建立素引,这种方式分不分区都一 一样,一般不使用:还有一一种就是自定义数据区间的索引,也叫做前缴索引,这个是非常有意义的,自定义区域值时注意必须要maxvalue.

另外要注意一点就是:在分区上建立的索引必须是分区字段列

local方式语法: create index idex_name on table(field) local;

  查看分区索引: select * from user_ ind_ partitions;

global自定义全局(前缀索引)引方式语法:

  create index idex_name on table(field) global

    partition by range (field)

    (

      partition p1 values less than(value),

      partition p2 values less than(maxvalue)

    );

globat全局索引方式语法: create index idxname ontable (field) global;

 

四  hash分区示例

hash分区作用:hash分区实现均匀的负载值分配,増加HASH分区可以重新分布数据。

  -- 示例1 建立散列分区表

  create table my_ emp

   (

    empno number,

    ename varchar2 (10)

  )

  partition by hash (empno)

  (

    partition p1,partition p2

  );

  -- 2査看分区表结构

  select * from user_ tab_partitions where table_name = 'MY_ EMP';

  -- 3插入数搭

  insert into my_emp vaIues (1, 'A');

  insert into my_emp vaIues (2, 'B') ;

  insert into my_emp vaIues (3, 'C');

  -- 4査看分区数据

  select * from my_emp partition (p1) ;

  select * from my_emp partition (p2) ;

 

五  list分区示例

  -- 1 建立列表分区表

  create table personcity

  (

    id number,

    name varchar2(10),

    city varchar2(10)

  )

  partition by list(city)

  (

    partition east values('tianjin', 'dalían'),

    partition vest values('xian') ,

    partition south values ('shanghai '),

    partition north values ('herbin'),

    partition other values (default)

  ):

  insert into personcity values(1, 'sohu', 'tianjin') ;

  insert into personcity values(2, 'sina', 'herbin');

  insert into personcity values(3, 'yahoo', 'dalian') ;

  insert into personcity values(4, '360', 'zhengzhou') ;

  insert into personcity values(5, 'baidu', 'xian');

  -- 2 查询

  select * from personcity partition(east) ;

 

六  复合分区示例

复合分区概念:把范围分区和散列分区相结合或者把范围分区和列表分区相结合。

  -- 1 建立复合分区表

  create table student

  (

    sno number,

    sname varchar2(10)

  )

  partition by range (sno)

  subpartition by hash (sname)

  subpartitions 4

  (

    partition p1 values less than (1000) ,

    partition p2 values less than (2000) ,

    partition p3 values less than (maxvalue)

  );

  -- 2 查询

  select * from user_tab_partitions vhere table_name= 'STUDENT' ;

  select * from user_tab_subpartitions where table_name= 'STUDENT' ;

 

七  间隔分区示例

间隔分区概念:间隔分区(nterval Partitioning)是一种分区自动化的分区,可以指定时间间隔进行分区,这是oracle11g的新特性,这个功能在实际的工作中也非常常用。

间隔分区(nterval Partitioning),一直是oracle数据库引以为荣的一项技术,正是分区的存在让oracle高效的处理海量数据成为可能。

间隔分区(nterval Partitioning)实际上是由range分区引申的,最终实现了range分区的自动化。

示例:将小于2019-02-01的数据每一个月生成一个分区

  create table interval_sale(sid int, sdate timestamp)

  partition by range(sdate)

  interval (numtoyminterval(1,'MONTH'))

  (

    partition p1 values less than (TIMESTAMP '2019-02-01 00:00:00.00')

  )

 

posted @ 2019-02-23 23:02  programmLover  阅读(633)  评论(0)    收藏  举报