單表 500 萬筆,所有資料放在同一顆實體磁碟,併發存取產生嚴重 I/O 等待。解法:分區表 + 多磁碟/表空間分散,將不同分區置於不同物理磁碟,I/O 吞吐成倍提升。
前提:分區必須落在不同磁碟/表空間,否則無效果。
適用:資料有明顯分類欄位(產品類別、交易日期、地區代碼)。
CREATE TABLE product_info (
prod_id NUMBER,
prod_type VARCHAR2(20), -- '成品','零件','包裝'
...
)
PARTITION BY LIST (prod_type) (
PARTITION p_finished VALUES ('成品') TABLESPACE ts_finished,
PARTITION p_parts VALUES ('零件') TABLESPACE ts_parts,
PARTITION p_packing VALUES ('包裝') TABLESPACE ts_packing
);
SELECT * FROM product_info PARTITION (p_finished);BACKUP TABLESPACE ts_finished;適用:表含大型 LOB/圖片欄位(身分證影本、簽名檔),平時查詢不需讀取,且異動頻率極低。
CREATE TABLE emp_info (
emp_id NUMBER PRIMARY KEY,
name VARCHAR2(50),
id_card_photo BLOB
)
LOB (id_card_photo) STORE AS (
TABLESPACE ts_lob -- 獨立磁碟
);
Oracle 11g+ 支援 SECUREFILE 壓縮/去重,進一步降低 LOB 磁碟佔用。
適用:資料分布均勻、無業務切分鍵、需平行度提升。
CREATE TABLE big_log (
log_id NUMBER,
log_ts TIMESTAMP,
msg VARCHAR2(4000)
)
PARTITION BY HASH (log_id) PARTITIONS 8 -- 2^n 取得均勻分布
STORE IN (ts_hash1, ts_hash2, ts_hash3, ts_hash4);
重大限制:僅支援本地索引,全域索引不可用。若查詢高度依賴全域索引,雜湊分區可能得不償失。
查詢 V$FILESTAT 或 DBA_HIST_FILESTATXS 觀察 AVG_READ_TIME、AVG_WRITE_TIME,若特定檔案明顯較高 → 該磁碟為熱點,需分散。