select * from emp;
--分区
--表分区的分类:1、范围、2、散列 3、列表、4、复合
--范围分区的语法:
PARTITION BY RANGE (column_name)
(
PARTITION part1 VALUES LESS THAN(range1),
PARTITION part2 VALUES LESS THAN(range2),
...
[PARTITION partN VALUES LESS THAN(MAXVALUE)]
);
--创建几个表空间
create tablespace area1
datafile 'D:/area1.dbf'
size 32M
autoextend on
next 32M
maxsize unlimited
create tablespace area2
datafile 'D:/area2.dbf'
size 32M
autoextend on
next 32M
maxsize unlimited
create tablespace area3
datafile 'D:/area3.dbf'
size 32M
autoextend on
next 32M
maxsize unlimited
--范围分区:以表中的一个列或一组列的值的范围分区
--小于1000的放在一个分区 p1, area1(表空间)
--从1000到2000的放在一个分区 p2, area2(表空间)
--大于2000的放在一个分区 p3 , area3(表空间)
create table test_emp
(
empno number primary key,
ename varchar2(20),
address varchar2(20),
sal float
)
partition by range(sal)
(
partition p1 values less than(1000) tablespace area1, --小于1000的放在一个分区
partition p2 values less than(2000) tablespace area2, --从1000到2000的放在一个分区 p2
partition p3 values less than(maxvalue) tablespace area3 --大于2000的放在一个分区
)
--maxvalue 是一个不确定的值,大于上一个分区的最大值
--往表中插入记录
insert into test_emp values(1,'张三','湖南',800);
insert into test_emp values(2,'张四','湖南',1200);
insert into test_emp values(3,'张五','湖南',2200);
select * from test_emp;
drop table test_emp;
--这个时候我们去删除表空间
drop tablespace area1 including contents and datafiles;
--这个时候会报错,要想删除此表空间,首先要删除这个表空间里面存在分区的表(跨多个表空间)
--按分区查询(只查询p1分区的内容)
select * from test_emp partition(p3);
--将不同的分区放置在同一个表空间
create table test_emp1
(
empno number primary key,
ename varchar2(20),
address varchar2(20),
sal float
)
partition by range(sal)
(
partition p1 values less than(1000) , --小于1000的放在一个分区
partition p2 values less than(2000), --从1000到2000的放在一个分区 p2
partition p3 values less than(maxvalue) --大于2000的放在一个分区
)
insert into test_emp1 values(1,'张三','湖南',800);
insert into test_emp1 values(2,'张四','湖南',1200);
insert into test_emp1 values(3,'张五','湖南',2200);
select * from test_emp1 partition(p1);--按分区查找
delete from test_emp1 partition(p1);--按分区删除数据
--散列分区
--hash “哈希” "杂凑" address = hash(Key)
PARTITION BY HASH (column_name)
PARTITIONS number_of_partitions;
或
PARTITION BY HASH (column_name)
( PARTITION part1 [TABLESPACE tbs1],
PARTITION part2 [TABLESPACE tbs2],
...
PARTITION partN [TABLESPACE tbsN]);
--创建表,按散列分区
create table test_emp1
(
empno number,
ename varchar2(20),
department varchar2(20)
)
partition by hash(department)
(
partition p1,
partition p2,
partition p3
)
--drop table test_emp1
insert into test_emp1 values(1,'张三','开发部');
insert into test_emp1 values(2,'李四','测试部');
insert into test_emp1 values(3,'王五','技术部');
select * from test_emp1 partition(p3);
create table ttt
(
ename varchar2(20),
address varchar2(20)
)
partition by hash(address)
partitions 3;
--分区名称由系统分配
select * from user_tab_partitions where table_name='TTT';--查询当前用户下表的分区
insert into ttt values('张三','湖南长沙');
insert into ttt values('李四','湖南娄底');
insert into ttt values('王五','湖南常德');
select * from ttt partition(SYS_P82);
--列表分区(当某个字段的值比较确定的情况下面,我们是用列表分区)
PARTITION BY LIST (column_name)
(
PARTITION part1 VALUES (values_list1),
PARTITION part2 VALUES (values_list2),
...
PARTITION partN VALUES (DEFAULT)
);
drop table people;
--湖南(长沙,娄底,邵阳,常德)
create table people
(
pno number,
pname varchar2(20),
paddress varchar2(20)
)
partition by list(paddress)
(
partition p1 values ('长沙','常德'),
partition p2 values ('娄底'),
partition p3 values ('邵阳')
)
insert into people values (1,'张三','长沙');
insert into people values (2,'张2','娄底');
insert into people values (3,'张3','邵阳');
insert into people values (4,'张4','常德');
insert into people values (5,'张5','长沙');
select * from people partition (p1);
--复合分区
--语法:
PARTITION BY RANGE (column_name1)
SUBPARTITION BY HASH (column_name2)
SUBPARTITIONS number_of_partitions
(
PARTITION part1 VALUE LESS THAN(range1),
PARTITION part2 VALUE LESS THAN(range2),
...
PARTITION partN VALUE LESS THAN(MAXVALUE)
);
--例:
CREATE TABLE SALES
(
PRODUCT_ID VARCHAR2 (5),
SALES_DATE DATE NOT NULL,
SALES_COST NUMBER (10)
)
PARTITION BY RANGE (SALES_DATE) --在SALES_DATE上进行范围分区
SUBPARTITION BY HASH (PRODUCT_ID) --是在每个分区中按PRODUCT_ID 进行散列分区
SUBPARTITIONS 5 --划分5个子分区
(
PARTITION S1 VALUES LESS THAN (TO_DATE('01/4月/2001', 'DD/MON/YYYY')),
PARTITION S2 VALUES LESS THAN (TO_DATE('01/7月/2001','DD/MON/YYYY')),
PARTITION S3 VALUES LESS THAN (TO_DATE('01/9月/2001','DD/MON/YYYY'))
-- PARTITION S4 VALUES LESS THAN (MAXVALUE)
);
select * from sales;
drop table sales;
insert into sales values('1001',to_date('02/2月/2001','DD/MON/YYYY'),1000);
insert into sales values('1002',to_date('02/6月/2001','DD/MON/YYYY'),2000);
insert into sales values('1003',to_date('02/8月/2001','DD/MON/YYYY'),3000);
select * from sales partition(s2);
insert into sales values('1004',to_date('02/12月/2001','DD/MON/YYYY'),3000);
--添加分区
ALTER TABLE sales ADD PARTITION P4 VALUES LESS THAN(TO_DATE('01/11月/2001','DD/MON/YYYY'));
alter table sales add partition p5 values less than(maxvalue);
--删除分区
alter table sales drop partition p5;
select * from user_tab_partitions where table_name='SALES';
alter table sales drop partition p4;
--截取分区(删除某个分区里面的全部内容,但是分区存在)
alter table sales truncate partition s3;
--合并分区 - 将范围分区或复合分区的两个相邻分区连接起来
alter table SALES
merge PARTITIONS S1, S2 INTO PARTITION S2;
--拆分分区 - 将一个大分区中的记录拆分到两个分区中
alter table sales split partition s2 at (TO_DATE('01/4月/2001', 'DD/MON/YYYY'))
into (partition s21,partition s22)
select * from sales partition(s22);
select * from user_tab_partitions where table_name='SALES';
oracle表分区
最新推荐文章于 2022-10-25 15:46:45 发布