表空間是一個或多個數據文件的集合,全部的數據對象都存放在指定的表空間中,但主要存放的是表, 因此稱做表空間 。數據庫
當表中的數據量不斷增大,查詢數據的速度就會變慢,應用程序的性能就會降低,這時就應該考慮對錶進行分區。表進行分區後,邏輯上表仍然是一張完整的表,只是將表中的數據在物理上存放到多個表空間(物理文件上),這樣查詢數據時,不至於每次都掃描整張表。安全
注意:已經存在的表沒有方法能夠直接轉化爲分區表 less
Oracle容許用戶將一個表分紅多個分區,用戶能夠執行查詢,只訪問表中的特定分區,也將不一樣的分區存儲在不一樣的磁盤,提升訪問性能和安全性。表的每一個部分都稱爲「分區」,用戶能夠獨立地備份和恢復每一個分區,能夠經過引用邏輯表名進行查詢和更新。函數
Oracle的表分區功能經過改善可管理性、性能和可用性,從而爲各式應用程序帶來了極大的好處。一般,分區可使某些查詢以及維護操做的性能大大提升。此外,分區還能夠極大簡化常見的管理任務,分區是構建千兆字節數據系統或超高可用性系統的關鍵工具工具
分區功能可以將表、索引或索引組織表進一步細分爲段,這些數據庫對象的段叫作分區。每一個分區有本身的名稱,還能夠選擇本身的存儲特性。從數據庫管理員的角 度來看,一個分區後的對象具備多個段,這些段既可進行集體管理,也可單獨管理,這就使數據庫管理員在管理分區後的對象時有至關大的靈活性。可是,從應用程 序的角度來看,分區後的表與非分區表徹底相同,使用 SQL DML 命令訪問分區後的表時,無需任何修改性能
一、加強可用性:若是表的某個分區出現故障,表在其餘分區的數據仍然可用;spa
二、維護方便:若是表的某個分區出現故障,須要修復數據,只修復該分區便可;對象
三、均衡I/O:能夠把不一樣的分區映射到磁盤以平衡I/O,改善整個系統性能;索引
四、改善查詢性能:對分區對象的查詢能夠僅搜索本身關心的分區,提升檢索速度。事件
一、表的大小超過2GB。
二、表中包含歷史數據,新的數據被增長都新的分區中。
1.以表中的一個列或一組列的值的範圍將行映射到分區
2.由表的分區規範進行定義;partition by range(column_list)
3.由每一個單獨分區的分區規範進行定義:values less than(value_list);
範圍分區的語法:
PARTITION BY RANGE (column_name) ( PARTITION part1 VALUES LESS THAN(range1), PARTITION part2 VALUES LESS THAN(range2), ... [PARTITION partN VALUES LESS THAN(MAXVALUE)] );
範圍分區示例
CREATE TABLE Sales ( Product_ID varchar2 (5), Sales_Cost number (10) ) PARTITION BY RANGE (Sales_Cost) --根據 Sales_Cost 建立分區 ( PARTITION P1 VALUES LESS THAN (1000), --包含銷售成本低於1000 的全部產品的值 PARTITION P2 VALUES LESS THAN (2000), PARTITION P3 VALUES LESS THAN (3000) ); --P1,P2,P3分區的名稱
CREATE TABLE SALES2 ( PRODUCT_ID VARCHAR2(5), SALES_DATE DATE NOT NULL, SALES_COST NUMBER(10)) PARTITION BY RANGE (SALES_DATE) ( PARTITION P1 VALUES LESS THAN (DATE '2003-01-01'), PARTITION P2 VALUES LESS THAN (DATE '2004-01-01'), PARTITION P3 VALUES LESS THAN (MAXVALUE) );
1.容許用戶對不具備邏輯範圍的數據進行分區
2.經過在分區鍵上執行HASH函數決定存儲的分區
3.將數據平均地分佈到不一樣的分區
散列分區語法
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 Employee ( Employee_ID varchar2 (5), Employee_Name varchar2(20), Department varchar2 (10) ) PARTITION BY HASH (Department) --在表 Employee上建立分區鍵 Department ( --建立 3 個分區 Partition D1, Partition D2, Partition D3 ); --D1,D2,D3分區的名稱
CREATE TABLE EMPLOYEE ( EMP_ID NUMBER(4), EMP_NAME VARCHAR2(14), EMP_ADDRESS VARCHAR2(15), DEPARTMENT VARCHAR2(10) ) PARTITION BY HASH (DEPARTMENT) PARTITIONS 4;
1.容許用戶將不相關的數據組織在一塊兒
列表分區的語法
PARTITION BY LIST (column_name) ( PARTITION part1 VALUES (values_list1), PARTITION part2 VALUES (values_list2), ... PARTITION partN VALUES (DEFAULT) );
列表分區示例
CREATE TABLE Employee ( Emp_ID number (4), Emp_Name varchar2 (14), Emp_Address varchar2 (15) ) --根據職員住址在表上建立的列表分區 PARTITION BY LIST (Emp_Address) ( Partition north values ('芝加哥'), --包含住在芝加哥的職員的記錄 Partition west values ('舊金山’, ‘洛杉磯'), Partition south values ('亞特蘭大', '達拉斯', '休斯頓'), Partition east values ('紐約', '波斯頓') ); --north,west......分區的名稱
1.範圍分區與散列分區或列表分區的組合
複合分區的語法:
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) );
複合分區示例
SQL> 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) ); --S1,S2,S3建立的四個範圍分區的名稱
在已分區的表中插入數據與操做普通表徹底相同,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);
查詢表上有多少分區
SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName'
分區維護的類型:
1.計劃事件 - 按期刪除最舊的分區
2.非計劃事件 - 解決應用程序或系統問題
分區維護操做有:
1.添加分區
2.刪除分區
3.截斷分區
4.合併分區
5.拆分分區
添加分區 – 在最後一個分區以後添加新分區
ALTER TABLE SALES ADD PARTITION P4 VALUES LESS THAN (4000);
刪除分區 – 刪除一個指定的分區,分區的數據也隨之刪除
ALTER TABLE SALES DROP PARTITION P4;
截斷分區 – 刪除指定分區中的全部記錄
ALTER TABLE SALES TRUNCATE PARTITION P3;
合併分區 - 將範圍分區或複合分區的兩個相鄰分區鏈接起來
ALTER TABLE SALES MERGE PARTITIONS S1, S2 INTO PARTITION S2;
拆分分區 - 將一個大分區中的記錄拆分到兩個分區中
ALTER TABLE SALES SPLIT PARTITION P2 AT (1500) INTO (PARTITION P21, PARTITION P22);