oracle表分区

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';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值