在大型企業應用中,數據量常達數十至數百 GB 甚至 TB 級。為提升讀寫查詢速度,Oracle 提供表與索引分區技術。主要優勢:
CREATE TABLESPACE dinya_space01 DATAFILE '/test/demo/Oracle/demodata/dinya01.dnf' SIZE 50M; CREATE TABLESPACE dinya_space02 DATAFILE '/test/demo/Oracle/demodata/dinya02.dnf' SIZE 50M; CREATE TABLESPACE dinya_space03 DATAFILE '/test/demo/Oracle/demodata/dinya03.dnf' SIZE 50M;
根據某列值的範圍決定數據存儲分區。常見場景:按交易序號分區、按業務記錄創建日期分區。
material_transactions,預計千萬級記錄按交易序號分區:
CREATE TABLE dinya_test ( transaction_id NUMBER PRIMARY KEY, item_id NUMBER(8) NOT NULL, item_description VARCHAR2(300), transaction_date DATE NOT NULL ) PARTITION BY RANGE (transaction_id) ( PARTITION part_01 VALUES LESS THAN (30000000) TABLESPACE dinya_space01, PARTITION part_02 VALUES LESS THAN (60000000) TABLESPACE dinya_space02, PARTITION part_03 VALUES LESS THAN (MAXVALUE) TABLESPACE dinya_space03 );
交易 ID < 3000 萬存入 part_01,3000-6000 萬存入 part_02,>6000 萬存入 part_03。
按交易日期分區:
CREATE TABLE dinya_test (
transaction_id NUMBER PRIMARY KEY,
item_id NUMBER(8) NOT NULL,
item_description VARCHAR2(300),
transaction_date DATE NOT NULL
)
PARTITION BY RANGE (transaction_date) (
PARTITION part_01 VALUES LESS THAN (TO_DATE('2006-01-01','YYYY-MM-DD')) TABLESPACE dinya_space01,
PARTITION part_02 VALUES LESS THAN (TO_DATE('2010-01-01','YYYY-MM-DD')) TABLESPACE dinya_space02,
PARTITION part_03 VALUES LESS THAN (MAXVALUE) TABLESPACE dinya_space03
);
2006 年前數據存 part_01,2006-2010 年存 part_02,2010 年後存 part_03。
通過哈希算法將數據均勻分布到指定數量的分區,適合無明顯範圍邏輯的列(如客戶 ID)。語法:PARTITION BY HASH(column) PARTITIONS n。
結合範圍與 Hash:先按範圍分區,再在每個範圍分區內按 Hash 子分區。語法:PARTITION BY RANGE(col1) SUBPARTITION BY HASH(col2) SUBPARTITIONS n。適合既需歷史數據管理又需並行查詢優化的場景。
ALTER TABLE ... ADD PARTITION ...ALTER TABLE ... MERGE PARTITIONS ...ALTER TABLE ... SPLIT PARTITION ...ALTER TABLE ... TRUNCATE PARTITION ...(快速清空數據)ALTER TABLE ... EXCHANGE PARTITION ... WITH TABLE ...(與非分區表交換數據,便於數據加載/歸檔)ALTER TABLE ... MOVE PARTITION ... TABLESPACE ...(調整存儲位置)