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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章