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

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