重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
一、创建分区表
站在用户的角度思考问题,与客户深入沟通,找到锡山网站设计与锡山网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站设计、做网站、企业官网、英文网站、手机端网站、网站推广、域名申请、网站空间、企业邮箱。业务覆盖锡山地区。
1、范围分区
根据数据表字段值的范围进行分区
举个例子,根据学生的不同分数对分数表进行分区,创建一个分区表如下:create table range_fraction(
id number(8),
name varchar2(20),
fraction number(3),
grade number(2)
)
partition by range(fraction)
(
partition fraction_60 values less than(60), --不及格partition fraction_80 values less than(85), --及格partition fraction_100 values less than(maxvalue) --优秀)创建完分区表后向表中添加一些数据:declarename varchar2(10);
fraction number(5);
grade number(5);
i number(8):=1;
begin
for i in 1..100000 LOOP
SELECT CHR (ROUND (DBMS_RANDOM.VALUE (97, 122))) INTO NAME FROM DUAL;SELECT ABS(MOD(DBMS_RANDOM.RANDOM,101)) into fraction FROM DUAL;SELECT ABS(MOD(DBMS_RANDOM.RANDOM,10))+1 into grade FROM DUAL;insert into range_fraction values(seq_range_fraction.nextval ,name,fraction,grade);END LOOP;end;
查询分区表:--分别查询所有的,不及格的,中等的,优秀的成绩select * from range_fraction;select * from range_fraction partition(fraction_60) ;select * from range_fraction partition(fraction_80) ;select * from range_fraction partition(fraction_100) ;当我们的查询语句不指定分区的时候,如果分区字段出现在where条件之后,Oracle会自动根据字段值的范围扫描响应的分区:
select * from range_fraction where fraction30; 这句SQL执行的时候只会扫描不及格的分区select * from range_fraction where fraction80; 这句SQL执行的时候会扫描不及格和中等两个分区2、散列分区在范围分区中,分区字段的连续值通常出现在一个分区内,而在散列分区中,连续的字段值不一定存储在相同的分区中。散列分区把记录分布在比范围分区更多的分区上,这减少了I/O争用的可能性。
为了创建一个散列分区,应该用partition by hash语句代替partition by range子句,如下所示:
第一种为各个分区指定不同的表空间,表空间数量不用等于分区数量,当表空间数量大于分区数量的时候会循环写入各个表空间:
create table range_fraction1
(
id number(8),
name varchar2(20),
fraction number(3),
grade number(2)
)
partition by hash(fraction)
partitions 8
store in (users,tbs_haicheng)
第二种为每个分区指定一个分区名称并为其指定表空间:create table range_fraction1(
id number(8),
name varchar2(20),
fraction number(3),
grade number(1)
)
partition by hash(fraction)
(
partition p1 tablespace tbs_haicheng ,
partition p2 tablespace users
);
3、列表分区
还可以使用列表分区代替范围分区和散列分区。在列表分区中,告诉Oracle所有可能的值,并指定应当插入相应行的分区。
我们将1、2、3、4班级的数据放在一个分区,将6、7、8的数据放在一个分区,将其他的再放在一个分区,建表如下:
create table range_fraction1
(
id number(8),
name varchar2(20),
fraction number(3),
grade number(2)
)
partition by list(grade)
(
partition p1 values(1,2,3,4) tablespace tbs_haicheng ,partition p2 values(5,6,7,8) tablespace users,?
1
partition p3 values(default)
4、组合分区(创建子分区)
即分区的分区。例如可以先进行范围分区,再对各个范围分区创建列表分区。
对于非常大的表来说,这种组合分区是一种把数据分成可管理和可调整的组成部分的有效方法。
举个例子:按照分数范围分区后再将ID散列分区:
create table range_fraction1
(
id number(8),
name varchar2(20),
fraction number(3),
grade number(1)
)
partition by range(fraction)
subpartition by hash(id)
subpartitions 4
(
partition fraction_60 values less than(60), --不及格partition fraction_80 values less than(85), --及格partition fraction_100 values less than(maxvalue) --优秀)二、索引分区
在分区表上可以建立三种类型的索引:1和普通表一样的全局索引;2.全局分区索引;3.本地分区索引1.建立普通的索引create index index_fraction on range_fraction(fraction);2.建立本地分区索引(就是一个索引分区只能对应一个表分区)?
create index local_index_fraction on range_fraction(fraction) local;3.建立全局分区索引(属于散列索引分区,就是一个索引分区可能指向多个表分区)?
create index global_index_fraction on range_fraction(fraction)GLOBAL partition by range(fraction)(
part_01 values less than(1000),
part_02 values less than(MAXVALUE)
);
三、管理分区表
1、增加分区
对于范围分区来说,添加一个分区,必须该分区划定的界限高于原来的最大界限,也就是说只能往上加,不能往下加。那么对于用maxvalue关键字创建的范围分区就不能增加分区了举例:
create table range_fraction
(
id number(8),
name varchar2(20),
fraction number(3),
grade number(2)
)
partition by range(fraction)
(
partition fraction_60 values less than(40), --不及格partition fraction_80 values less than(60), --及格partition fraction_100 values less than(80) --优秀)对于该分区我们增加一个分区:
ALTER TABLE range_fraction ADD PARTITION fraction_100 VALUES LESS THAN (100);为列表分区添加一个分区:
create table range_fraction
(
id number(8),
name varchar2(20),
fraction number(3),
grade number(2)
)
partition by list(grade)
(
partition p1 values(1,2,3) tablespace tbs_haicheng ,partition p2 values(4,5,6) tablespace users);ALTER TABLE range_fraction ADD partition p3 VALUES (7,8);我们再为p3分区新增两个表分区值:
ALTER TABLE range_fraction MODIFY PARTITION p3 ADD VALUES(9,10);然后再将p3分区的表分区值中的10删掉:
ALTER TABLE range_fraction MODIFY PARTITION p3 DROP VALUES(10);为哈希分区添加一个子分区:
ALTER TABLE TABLENAME ADD PARTITION PARTNAME;添加一个子分区的格式:
ALTER TABLE TABLENAME MODIFY PARTITION PARTNAME ADD SUBPARTITION SUBPARTNAME;2、删除分区删除分区比较简单,格式如下:
ALTER TABLE ... DROP PARTITION part_name;3、分区合并合并父分区格式:ALTER TABLE TABLENAME MERGE PARTITIONS p1-1, p1-2 INTO PARTITION p1 UPDATE INDEXES;如果省略了UPDATE INDEXES 的话需要为受影响的分区重建索引合并子分区的格式:
ALTER TABLE TABLENAME
MERGE SUBPARTITIONS part_1_sub_2, part_1_sub_3 INTO SUBPARTITION part_1_sub_2 UPDATE INDEXES;4、转换分区可以将分区表转换成非分区表,或者几种不同分区表之间的转换。如下:
CREATE TABLE hash_part02 AS SELECT * FROMhash_example WHERE 1=2;ALTER TABLE hash_example EXCHANGE PARTITIONpart02 WITH TABLE hash_part02;这时,分区表hash_example中的part02分区的资料将被转移到hash_part02这个非分区表中。
1、一般分区表都会很大,所以可以先创建表空间,为了让分区表存放到单独的表空间,否则默认会存放到USERS表空间
2、创建TABLESPACE TS1:
CREATE TABLESPACE TS1 DATAFILE '/data1/oracle/test.dbf' SIZE 512M AUTOEXTEND ON NEXT 512M MAXSIZE UNLIMITED;
3、创建分区表,需要确定按什么分区,比如按id或按时间段:
CREATE TABLE test_201602
(
ID NUMBER(10) NOT NULL,
CREATE_TIME DATE,
)
TABLESPACE TS1
PARTITION BY LIST (ID)
(PARTITION PT_1001 VALUES (1001) TABLESPACE TS1);
4、继续增加分区
ALTER TABLE test_201602 ADD PARTITION "PT_1003" VALUES (1003) LOGGING NOCOMPRESS;
ALTER TABLE test_201602 ADD PARTITION "PT_1004" VALUES (1004) LOGGING NOCOMPRESS;
5、查询表及分区数量
select TABLE_NAME,PARTITION_COUNT,DEF_TABLESPACE_NAME from USER_PART_TABLES order by DEF_TABLESPACE_NAME;
可以的,比如有分区表如下:
create table test
(
msg_id VARCHAR2(16),
result INTEGER,
ts VARCHAR2(17),
ts_time TIMESTAMP(6),
insert_time DATE)
partition by range (TS_TIME)
(
partition P20180110 values less than (TIMESTAMP' 2018-01-11 00:00:00')
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K next 1M
minextents 1
maxextents unlimited
)
);
如果想增加分区:
alter table test add partition P20180112 values less than (to_date('20180113 00:00:00','yyyymmdd hh24:mi:ss'));
1、创建语句
create table p(id number)
partition by range(id)
(partition p1 values less than(100) tablespace t1,
partition p2 values less than(200) tablespace t2,
partition p3 values less than(300) tablespace t3);
2、添加分区
alter table p add partition p4 values less than (400) tablespace t4;
3、清除分区数据
alter table p trunc partition p1;
4、删除分区
alter table p drop partition p1;
如果是分区表可以添加分区,如果不是分区表,可以把表转换成分区表,再增加分区。