分區表是大型資料庫管理海量資料的核心機制。本文系統整理 Oracle 提供的分區相關資料字典視圖,並提供可直接執行的查詢腳本,涵蓋分區表識別、分區類型、分區詳情、分區鍵欄位、子分區等完整資訊。
| 範圍 | 分區表基本資訊 | 分區詳細資訊 | 分區鍵欄位 | 子分區資訊 | 子分區鍵欄位 |
|---|---|---|---|---|---|
| 全庫 (DBA_) | DBA_PART_TABLES | DBA_TAB_PARTITIONS | DBA_PART_KEY_COLUMNS | DBA_TAB_SUBPARTITIONS | DBA_SUBPART_KEY_COLUMNS |
| 可存取 (ALL_) | ALL_PART_TABLES | ALL_TAB_PARTITIONS | ALL_PART_KEY_COLUMNS | ALL_TAB_SUBPARTITIONS | ALL_SUBPART_KEY_COLUMNS |
| 當前用戶 (USER_) | USER_PART_TABLES | USER_TAB_PARTITIONS | USER_PART_KEY_COLUMNS | USER_TAB_SUBPARTITIONS | USER_SUBPART_KEY_COLUMNS |
SELECT partitioned
FROM all_tables
WHERE owner = 'SCOTT' AND table_name = 'SALES';
-- 回傳 YES / NO
誤區:TABLESPACE_NAME IS NULL 不等於分區表(普通表也可能無表空間)。
SELECT owner, table_name, partitioning_type, subpartitioning_type, partition_count
FROM dba_part_tables
ORDER BY owner, table_name;
SELECT table_name, partition_name, tablespace_name, high_value, num_rows, blocks, compression
FROM dba_tab_partitions
WHERE table_name = 'GPRS_CELLTOPVOL_WK'
ORDER BY partition_position;
HIGH_VALUE 為分區上界值(LONG 型別,需用 DBMS_METADATA 或 PL/SQL 讀取完整)。
SELECT a.name, a.object_type, b.column_name, b.column_position
FROM dba_part_tables a
JOIN dba_part_key_columns b ON a.owner = b.owner AND a.name = b.name
WHERE a.name = 'GPRS_CELLTOPVOL_WK';
SELECT table_name, partition_name, subpartition_name, tablespace_name, high_value
FROM dba_tab_subpartitions
WHERE table_name = 'SALES_COMPOSITE'
ORDER BY partition_name, subpartition_position;
SELECT name, column_name, column_position
FROM dba_subpart_key_columns
WHERE name = 'SALES_COMPOSITE';
CREATE TABLE sales_composite (
sale_id NUMBER,
sale_date DATE,
region_id NUMBER,
amount NUMBER
)
PARTITION BY RANGE (sale_date)
SUBPARTITION BY HASH (region_id)
SUBPARTITIONS 4
(
PARTITION p_2023_q1 VALUES LESS THAN (TO_DATE('2023-04-01','YYYY-MM-DD')),
PARTITION p_2023_q2 VALUES LESS THAN (TO_DATE('2023-07-01','YYYY-MM-DD')),
PARTITION p_2023_q3 VALUES LESS THAN (TO_DATE('2023-10-01','YYYY-MM-DD')),
PARTITION p_2023_q4 VALUES LESS THAN (TO_DATE('2024-01-01','YYYY-MM-DD'))
);
ALTER TABLE sales ADD PARTITION p_2024_q1 VALUES LESS THAN (DATE '2024-04-01');ALTER TABLE sales MERGE PARTITIONS p_2023_q1, p_2023_q2 INTO PARTITION p_2023_h1;ALTER TABLE sales SPLIT PARTITION p_2023_q3 AT (DATE '2023-08-15') INTO (PARTITION p_2023_q3a, PARTITION p_2023_q3b);ALTER TABLE sales EXCHANGE PARTITION p_2023_q1 WITH TABLE staging_sales_q1 INCLUDING INDEXES WITHOUT VALIDATION;ALTER TABLE sales TRUNCATE PARTITION p_2023_q1 DROP STORAGE;DBA_TAB_PARTITIONS 時 HIGH_VALUE 為 LONG,大量表會拖慢查詢;建議僅選擇必要欄位或用 DBMS_METADATA.GET_DDL 取得完整定義。DBMS_STATS.GATHER_TABLE_STATS(ownname, tabname, granularity => 'PARTITION');