分区表

Posted wyx666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分区表相关的知识,希望对你有一定的参考价值。

 

概念:为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能

 

优点:

1增强可用性,提高数据安全:如果表的某个分区出现故障,表在其他分区的数据仍然可用;

2维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;

3均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能;

4改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

 

分区的方法

 

1范围分区

2HASH分区(散列分区)

3列表分区

4复合分区(范围+HASH)(范围+列表

 

先创建三个表空间

create tablespace test1 datafile ‘D:\oracle\product\10.2.0\db_1\oradata\orcl\test1.dbf‘size 10m;

create tablespace test2 datafile ‘D:\oracle\product\10.2.0\db_1\oradata\orcl\test2.dbf‘size 10m;

create tablespace test3 datafile ‘D:\oracle\product\10.2.0\db_1\oradata\orcl\test3.dbf‘size 10m;

 

 

1、范围分区

1范围分区就是对数据表中的某个值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。

 

create table material_test1

transaction_id number(10) primary key,

item_id number(20) not null,

  itdem_description varchar2(300),

    transaction_date date not null

 

)

partition by range(transaction_id)

(

      partition part_01 values less than(10) tablespace test1,

      partition part_02 values less than(60) tablespace test2,

      partition part_03 values less than(maxvalue) tablespace test3

)

 

 

 

2、hash 分区

1HASH实际上是一种算法,当向表插入数据时,系统会自动根据当前分区列的值计算出HASH值之后确定应该将该行存放在哪个分区中。

2在列的取值不容易确定时可以采用此方法。

 

create table material_test2

( transaction_id number(10) primary key,

item_id number(20) not null,

  itdem_description varchar2(300),

    transaction_date date not null

 

)

partition by hash(transaction_id)

(

      partition part_01  tablespace test1,

      partition part_02  tablespace test2,

      partition part_03  tablespace test3

)

 

 

 

3、列表分区

1对表的某个列的可列举的值进行分区

2如果分区的字段的值并不能划分范围,同时分区的值的取值有一个范围则在分区条件中可以只用枚举的方式列出分区字段的所有选项,从而达到分区的目的

3此功能是ORACLE10G 增加的功能

 

create table material_test3

( transaction_id number(10) primary key,

item_id number(20) not null,

  itdem_description varchar2(300),

    transaction_date date not null,

    city varchar2(100)

 

)

partition by list (city)

(

      partition part_01 values(‘北京‘)  tablespace test1,

      partition part_02 values(‘济南‘) tablespace test2,

      partition part_03 values(‘default‘) tablespace test3

)

 

 

 

4、复合分区(一种组合分区)-- 范围和 hash

 

create table material_test4

transaction_id number(10) primary key,

item_id number(20) not null,

  itdem_description varchar2(300),

    transaction_date date not null,

    city varchar2(100)

)

 

partition by range(transaction_date) subpartition by hash (transaction_id )

subpartitions 3 store in (test1,test2,test3)--根据日期将数据分区放好,然后再根据hash 来判断你的数据放在 t1 还是t2,t3

(

      partition part_01 values less than(to_date(‘20060101‘,‘yyyymmdd‘)) ,

      partition part_02 values less than(to_date(‘20100101‘,‘yyyymmdd‘)),

      partition part_03 values less than(maxvalue) 

);

 

 

分区表操作

 

1、数据插入

  当插入数据时,系统会自动根据数据的值,把新增的数据放置到指定分区中。

insert into  material_test1 values(1,12, ‘BOOKS‘, SYSDATE); 

insert into  material_test1 values(2,12, ‘BOOKS‘, SYSDATE+30); 

insert into  material_test1 values(3,12, ‘BOOKS‘, to_date(‘20060530‘,‘yyyymmdd‘)); 

insert into  material_test1 values(4,12, ‘BOOKS‘, to_date(‘20070530‘,‘yyyymmdd‘)); 

insert into  material_test1 values(5,12, ‘BOOKS‘, to_date(‘20110530‘,‘yyyymmdd‘)); 

insert into  material_test1 values(6,12, ‘BOOKS‘, to_date(‘20110530‘,‘yyyymmdd‘)); 

insert into  material_test1 values(7,12, ‘BOOKS‘, to_date(‘20110530‘,‘yyyymmdd‘)); 

insert into  material_test1 values(8,12, ‘BOOKS‘, to_date(‘20110530‘,‘yyyymmdd‘)); 

insert into  material_test1 values(9,12, ‘BOOKS‘, to_date(‘20110530‘,‘yyyymmdd‘)); 

insert into  material_test1 values(10,12, ‘BOOKS‘, to_date(‘20110530‘,‘yyyymmdd‘)); 

insert into  material_test1 values(11,12, ‘BOOKS‘, to_date(‘20110530‘,‘yyyymmdd‘)); 

commit;

select 

 

 

2、分区表操作(数据查询)

select * from material_test1 partition(part_01); 

select * from material_test1 partition(part_02); 

select * from material_test1 partition(part_03);

select * from material_test1;

rollback

 

3、分区表操作(更新、删除)

update 表名 set 列名=新值 where  条件

update  material_test1  partition(part_03) t set t.itdem_description=‘DESK‘

where t.transaction_id=1;  

commit; 

注:这里将第一个分区中的交易id=1的记录中的item_description字段更新为“DESK”,可以看到已经成功更新了一条记录。但是当更新的时候指定了分区,而根据查询的记录不在该分区中时,将不会更新数据

 

delete from material_test1  partition(part_02) t where t.transaction_id=10; 

commit; 

注:上面例子删除了第二个分区part_02中的交易记录ID为4的一条记录,和更新数据相同,

如果指定了分区,而条件中的数据又不在该分区中时,将不会删除任何数据

 

以上是关于分区表的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 分区表如何添加分区

oracle分区表的分区有几种类型

oracle分区表的分区有几种类型

如何删除分区表,要彻底!

查看oracle的分区表都有哪些分区

Hive 创建外部分区表