在oracle11g之前,常用的分区表类型为范围分区,散列分区,列表分区,
复合分区
1.范围分区
查看分区:
查看插入数据所在的分区:
2.列表分区
列表分区的特点就是某列的值只有几个
查看分区
查看数据所在的分区
3.散列分区
散列分区在列值上使用散列算法,以确定将行放在哪个分区中,当列值没有合适的条件时,使用散列分区
oracle中在建立散列分区时,一般只需要指定分区的数量即可,一般建议分区的数量为2的N次方,这样更有利于数据的负载均衡。
查看分区
查看各分区的数据
在Oracle11g及其以后,还有引用分区,间隔分区, 基于虚拟列的分区,系统分区
引用分区
引用分区:基于由外键引用父表的分区方法,它依赖已有的父表子表的关系,子表通过外键关联到父表,进而继承父表的分区方式而不需自己创建。主表可以是范围,散列,列表分区。
分别查看这两个表的分区情况:
若没有显示的指定分区的名称,默认会继承父表分区的名称。
间隔分区
间隔分区它可以自动的根据阀值创建范围分区,我们只需指定范围分区的起点,后续Oracle会知道如何分区,它是范围分区的扩展。
一般我们在实际的项目中,范围分区一般是以月份。现在建立一个间隔分区,每一个月为一个分区。
现插入数据和查看分区情况
基于虚拟列的分区
把分区建立在某个虚拟列上,即建立在函数或表达式的计算结果上,来完成某种任务
系统分区
不指定分区列,由oracle来完成分区的控制和管理,它没有了范围分区或列表分区的界限
1.范围分区
点击(此处)折叠或打开
- create table sale(
- prod_id varchar2(12),
- cust_id varchar2(12),
- quantity number(10,2)
- )
- partition by range(quantity)
- (
- partition p_1 values less than(1000),--TABLESPACE tabspace 这里可以指定分区所在的表空间
- partition p_2 values less than(2000),
- partition p_3 values less than(3000)
- );
-
- insert into sale values(1,'A',100);
- insert into sale values(2,'B',1100);
- insert into sale values(3,'C',2100);
- commit;
点击(此处)折叠或打开
- SELECT table_name,partition_name,partition_position,high_value FROM user_tab_partitions;

查看插入数据所在的分区:
点击(此处)折叠或打开
- select * from sale partition(p_1);
- select * from sale partition(p_2);
- select * from sale partition(p_3);

2.列表分区
列表分区的特点就是某列的值只有几个
点击(此处)折叠或打开
- create table product(
- prod_id varchar2(12),
- prod_name varchar2(32),
- price number(16,6)
- )
- partition by list(prod_name)
- (
- partition p_1 values('phone'),
- partition p_2 values('computer'),
- partition p_3 values('car')
- );
-
- insert into product values(1,'phone',1000);
- insert into product values(2,'computer',2000);
- insert into product values(3,'car',20000);
- commit;
点击(此处)折叠或打开
- SELECT table_name,partition_name,partition_position,high_value FROM user_tab_partitions
- WHERE table_name = 'PRODUCT'

查看数据所在的分区
点击(此处)折叠或打开
- select * from product partition(p_1);
- select * from product partition(p_2);
- select * from product partition(p_3);

3.散列分区
散列分区在列值上使用散列算法,以确定将行放在哪个分区中,当列值没有合适的条件时,使用散列分区
点击(此处)折叠或打开
- CREATE TABLE student(
- stu_id VARCHAR(12),
- stu_name VARCHAR2(32),
- stu_phone VARCHAR2(11)
- )
- PARTITION BY HASH(stu_phone) PARTITIONS 4
- --store in (tabspace) 这个指定分区所存储的表空间
- ;
-
- INSERT INTO student VALUES('101','A','13567891111');
- INSERT INTO student VALUES('102','B','13587900110');
- INSERT INTO student VALUES('103','C','13567891234');
- INSERT INTO student VALUES('104','D','13523468901');
- commit;
查看分区
点击(此处)折叠或打开
- SELECT table_name,partition_name,partition_position,high_value FROM user_tab_partitions
- WHERE table_name = 'STUDENT'

查看各分区的数据

在Oracle11g及其以后,还有引用分区,间隔分区, 基于虚拟列的分区,系统分区
引用分区
引用分区:基于由外键引用父表的分区方法,它依赖已有的父表子表的关系,子表通过外键关联到父表,进而继承父表的分区方式而不需自己创建。主表可以是范围,散列,列表分区。
点击(此处)折叠或打开
- create table product(
- prod_id varchar2(12),
- prod_name varchar2(32),
- price number(16,6),
- constraint pk_id primary key (prod_id)
- )
- partition by list(prod_id)
- (
- partition p_1 values('phone'),
- partition p_2 values('computer'),
- partition p_3 values('car')
-
- );
-
- create table sale(
- prod_id varchar2(12) not null, --这里需要指定Not null约束,否则报错。是在oracle11.2.0.1.0
- cust_id varchar2(12),
- quantity number(10,2),
- constraint fk_id foreign key(prod_id) references product(prod_id)
- )
- partition by reference(fk_id);
点击(此处)折叠或打开
- SELECT table_name,partition_name,partition_position,high_value FROM user_tab_partitions
- WHERE table_name IN ('PRODUCT','SALE')

若没有显示的指定分区的名称,默认会继承父表分区的名称。
间隔分区
间隔分区它可以自动的根据阀值创建范围分区,我们只需指定范围分区的起点,后续Oracle会知道如何分区,它是范围分区的扩展。
一般我们在实际的项目中,范围分区一般是以月份。现在建立一个间隔分区,每一个月为一个分区。
点击(此处)折叠或打开
- create table sale(
- statis_dt date,
- sale_amount number(18,6),
- prod_name varchar2(12)
- )
- partition by range(statis_dt)
- interval(numtoyminterval(1,'MONTH'))
- (
- partition p_1 values less than(to_date('20160201','yyyymmdd'))
- );
点击(此处)折叠或打开
- insert into sale values(to_date('20151231','yyyymmdd'),1000,'iphone7');
- commit;
点击(此处)折叠或打开
- SELECT table_name,partition_name,partition_position,high_value FROM user_tab_partitions
- WHERE table_name IN ('SALE')

点击(此处)折叠或打开
- insert into sale values(to_date('20160531','yyyymmdd'),1000,'iphone8');
- commit;
点击(此处)折叠或打开
- SELECT table_name,partition_name,partition_position,high_value FROM user_tab_partitions
- WHERE table_name IN ('SALE')

点击(此处)折叠或打开
- insert into sale values(to_date('20160430','yyyymmdd'),1000,'iphone7s');
- commit;
点击(此处)折叠或打开
- SELECT table_name,partition_name,partition_position,high_value FROM user_tab_partitions
- WHERE table_name IN ('SALE')

基于虚拟列的分区
把分区建立在某个虚拟列上,即建立在函数或表达式的计算结果上,来完成某种任务
系统分区
不指定分区列,由oracle来完成分区的控制和管理,它没有了范围分区或列表分区的界限
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29782424/viewspace-2130011/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29782424/viewspace-2130011/