【Oracle11g】11_表分區



表分區:

  • 表分區是指允許用戶將一個表分成多個分區
  • 用戶可以執行查詢,只訪問表中的特定分區
  • 將不同的分區存儲在不同的磁盤,提高訪問性能和安全性。
  • 可以獨立的備份和恢復每個分區

1.傳統的表分區類型

1.1 范圍分區

概念:以表中的一個列或一組列的值的范圍分區
語法:

PARTITION BY RANGE (column_name)
(
  PARTITION part1 VALUE LESS THAN(range1),
  PARTITION part2 VALUE LESS THAN(range2),
  ...
  [PARTITION partN VALUE LESS THAN(MAXVALUE)]
);

實戰演練

-- 創建范圍分區表
create table person(
 p_id varchar2(10)
,p_name varchar2(10)
,p_age number)
partition by range(p_age)
(
	partition p1 values less than(18),
	partition p2 values less than(30),
	partition p3 values less than(35)
);

-- 插入數據(在范圍分區內可以成功插入)
insert into person values('p001','Jack',17);
insert into person values('p002','Lucy',18);
insert into person values('p003','Alice',32);
commit;

上述代碼中的三條insert 語句可以正常插入,但是如果插入一條超出范圍的語句,則無法插入,例如:

-- 插入一條超出范圍語句
insert into person values('p004','Tom',60);

報錯如下:

那么要想插入這條記錄,該如何辦呢?答案是:新增分區
新增分區的語句為:

-- 添加分區,此處的maxvalue表示無窮大
alter table person add partition p4 values less than(maxvalue);

查看分區表的數據

SQL> select * from person partition(p1);

P_ID       P_NAME          P_AGE
---------- ---------- ----------
p001       Jack               17

SQL> select * from person partition(p2);

P_ID       P_NAME          P_AGE
---------- ---------- ----------
p002       Lucy               18

查詢分區信息

select  * from user_tab_partitions u where u.table_name='PERSON'

1.2 散列分區

概念:

  • 允許用戶對不具有邏輯范圍的數據進行分區
  • 通過在分區鍵上執行HASH函數決定存儲的分區
  • 將數據平均地分布到不同的分區
    語法:
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 my_emp(
empno number,ename varchar(10))
partition by hash(empno)
(
	partition p1,partition p2
);

1.3 列表分區

概念:允許用戶將不相關的數據組織在一起。
語法:

PARTITION BY LIST (column_name)
(
  PARTITION part1 VALUES (values_list1),
  PARTITION part2 VALUES (values_list2),
  ...
  PARTITION partN VALUES (DEFAULT)
);

實戰演練

-- 建表
create table area(
id number,area_name varchar(10)
)
partition by list(area_name)
(
	partition Yunnan values('曲靖','昆明','紅河'),
	partition Beijing values('房山區','西城區','門頭溝'),
	partition Shanghai values('黃浦區','徐匯區','楊浦溝'),
	partition Shandong values('青島','煙台','菏澤')
);

-- 插入數據
insert into area values(1,'昆明');
insert into area values(2,'房山區');
insert into area values(3,'青島');

--查詢數據
select * from area partition(Beijing);

1.4 復合分區

概念:
只有2種組合:(1)范圍-散列分區組合 ;(2)范圍-列表分區組合
語法:

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 studentInfo(
	sno number,sname varchar(100)
)
partition by range(sno)
subpartition by hash(sname)
subpartitions 4 --表示每一個范圍分區后再划分為4個小分區,該表總共有12個分區
(
	partition p1 values less than(1000),
	partition p2 values less than(2000),
	partition p3 values less than(maxvalue)
)

通過em控制台可以查看所有的分區:進入em -->> 方案 -->> 表 -->> 輸入方案名 -->> 找到表

從上圖可以看到總共有12個分區

2.Oracle 11g新增的分區

新增的分區有:

  • 引用分區
  • 間隔分區
  • 基於虛擬列的分區
  • 系統分區

2.1 引用分區

引用分區:基於由外鍵引用的父表的分區的方法,它依賴已有的父表子表的關系,子表通過外鍵關聯到父表,進而繼承了父表的分區方式而不需自己創建,子表還繼承了父表的維護操作。

  • 主表是范圍分區,子表是引用分區
  • 主表是列表分區,子表是引用分區
  • 主表是散列分區,子表是引用分區

實戰演練


--------學生表
create table student(
	stu_id number primary key, stu_name varchar2(10),grade varchar2(100)
)
partition by range(stu_id)
(
	partition par_stu1 values less than(1000),
	partition par_stu2 values less than(2000),
	partition par_stu3 values less than(maxvalue)
);

---成績表
create table score(
	id number primary key, 
	stu_id number not null,
	course_name varchar2(20),
	score number,
	constraint fk_score foreign key(stu_id) references student(stu_id)
)
partition by reference(fk_score);

通過以下案例分析下引用分區原理


---學生表插入數據並查看delete 
insert into student values(1,'AA','三年級');
insert into student values(10,'BB','五年級');
commit;
select * from student partition(par_stu1);

---成績表插入數據並查看
insert into score values(1,1,'數學',90);
insert into score values(2,10,'語文',85);
commit;
select * from score partition(par_stu1);

查詢分區表的語法基本一致,只需要替換表名即可

2.2 間隔分區

間隔分區:可以完全自動地根據間隔閾值創建范圍分區,它是范圍分區的擴展 。 (一般是根據時間間隔分區)
在數據倉庫中有廣泛的應用。

create table sale_info(
	s_id number,s_name varchar2(10),s_no number,s_date date
)
partition by range(s_date)
interval(numtoyminterval(1,'MONTH'))
(
	partition p_200906 values less than (to_date('20090601','yyyymmdd'))
);

插入數據測試:

insert into sale_info values(1,100,20,to_date('20090331','yyyymmdd'));
insert into sale_info values(2,100,20,to_date('20090602','yyyymmdd'));
insert into sale_info values(3,100,20,to_date('20090702','yyyymmdd'));
commit;

查看分區后發現,新建了2個新的分區,上述建立分區的意思表示的是:當間隔時間大於1個月則新建分區。

假如我此時插入的日期是20091202,那么新增的分區,它的上界是20091201

2.3 基於虛擬列的分區

基於虛擬列的分區:把分區建立在某個虛擬列上,即建立在函數或表達式的計算結果上,來完成某種任務。

實戰演練

create table goods(
 g_id number,
 g_name varchar(200),
 g_price number,
 g_num number,
 total_price as (g_price * g_num) virtual
)
partition by range(total_price)
(
	partition p_1000 values less than (1000),
	partition p_2000 values less than (2000),
	partition p_max  values less than (maxvalue)
);

insert into goods(g_id,g_name,g_price,g_num) values(1,'啤酒',4,20); -- 進入分區p_1000
insert into goods(g_id,g_name,g_price,g_num) values(2,'洗衣機',3000,10); -- 進入分區p_max
commit;

2.4 系統分區

系統分區:不指定分區列,由ORACLE來完成分區的控制和管理,它沒有了范圍分區或列表分區的界限。

實戰演練


create table cust_info(
	id number,name varchar2(100)
)
partition by system
(
	partition p1,partition p2,partition p3
);

3.總結

3.1 增刪查分區表

  • 在已分區的表中插入數據與操作普通表完全相同,Oracle會自動將數據保存到對應的分區
  • 查詢、修改和刪除分區表時可以顯式指定要操作的分區
-- 插入
INSERT INTO SALES3 VALUES (‘P001’, ’02-3月-2001', 2000);
INSERT INTO SALES3 VALUES (‘P002’, ’10-5月-2001', 2508);
INSERT INTO SALES3 VALUES (‘P003’, ’05-7月-2001', 780);
INSERT INTO SALES3 VALUES (‘P004’, ’12-9月-2001', 1080);
--查詢
SELECT * FROM SALES3 PARTITION (P3);
--刪除
DELETE FROM SALES3 PARTITION (P2);

3.2 分區的維護

添加分區 -在最后一個分區之后添加新分區

SQL> ALTER TABLE SALESADD PARTITION P4 VALUES LESS THAN (4000);

刪除分區 – 刪除一個指定的分區,分區的數據也隨之刪除

SQL> ALTER TABLE SALES DROP PARTITION P4;

**截斷分區 – 刪除指定分區中的所有記錄 **

SQL> ALTER TABLE SALES TRUNCATE PARTITION P3;

合並分區 - 將范圍分區或復合分區的兩個相鄰分區連接起來

SQL> ALTER TABLE SALES MERGE PARTITIONS S1, S2 INTO PARTITION S2;

拆分分區 - 將一個大分區中的記錄拆分到兩個分區中

SQL> ALTER TABLE SALES SPLIT PARTITION P2 AT (1500) INTO (PARTITION P21, PARTITION P22);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM