Oracle 分區技術(企業版選購元件)能在特定條件下大幅提升查詢效能。本文透過完整實例,示範範圍分區表建立、本地索引跨表空間配置、資料載入、效能對比(分區 vs 非分區)、新增分區與索引自動維護全流程。
CREATE TABLE dbobjs (
OBJECT_ID NUMBER NOT NULL,
OBJECT_NAME VARCHAR2(128),
CREATED DATE NOT NULL
)
PARTITION BY RANGE (CREATED) (
PARTITION dbobjs_06 VALUES LESS THAN (TO_DATE('01/01/2007','DD/MM/YYYY')),
PARTITION dbobjs_07 VALUES LESS THAN (TO_DATE('01/01/2008','DD/MM/YYYY'))
);
SELECT SEGMENT_NAME, PARTITION_NAME, TABLESPACE_NAME
FROM DBA_SEGMENTS
WHERE SEGMENT_NAME = 'DBOBJS';
| SEGMENT_NAME | PARTITION_NAME | TABLESPACE_NAME |
|---|---|---|
| DBOBJS | DBOBJS_06 | EYGLE |
| DBOBJS | DBOBJS_07 | EYGLE |
CREATE INDEX dbobjs_idx ON dbobjs (CREATED) LOCAL
(
PARTITION dbobjs_06 TABLESPACE USERS,
PARTITION dbobjs_07 TABLESPACE USERS
);
亦可簡寫為統一表空間子句:
CREATE INDEX dbobjs_idx ON dbobjs (CREATED) LOCAL
(
PARTITION dbobjs_06 TABLESPACE USERS,
PARTITION dbobjs_07 TABLESPACE USERS
) TABLESPACE USERS;
| SEGMENT_NAME | PARTITION_NAME | TABLESPACE_NAME |
|---|---|---|
| DBOBJS_IDX | DBOBJS_06 | USERS |
| DBOBJS_IDX | DBOBJS_07 | USERS |
INSERT INTO dbobjs SELECT OBJECT_ID, OBJECT_NAME, CREATED FROM DBA_OBJECTS;
COMMIT;
SELECT COUNT(*) FROM DBOBJS PARTITION (DBOBJS_06); -- 6154 筆
SELECT COUNT(*) FROM DBOBJS PARTITION (DBOBJS_07); -- 73 筆
SELECT COUNT(DISTINCT(OBJECT_NAME))
FROM DBOBJS
WHERE CREATED < TO_DATE('01/01/2007','DD/MM/YYYY');
PARTITION RANGE (ALL) → INDEX (RANGE SCAN) OF 'DBOBJS_IDX'CREATE TABLE dbobjs2 AS SELECT * FROM DBA_OBJECTS;
CREATE INDEX dbobjs_idx2 ON dbobjs2 (CREATED);
SELECT COUNT(DISTINCT(OBJECT_NAME))
FROM DBOBJS2
WHERE CREATED < TO_DATE('01/01/2007','DD/MM/YYYY');
TABLE ACCESS (BY INDEX ROWID) → INDEX (RANGE SCAN)分區裁剪使掃描範圍大幅縮減,Consistent Gets 從 2,670 降至 101,效能提升顯著。隨資料量增長,優勢更明顯。
ALTER TABLE DBOBJS
ADD PARTITION DBOBJS_08 VALUES LESS THAN (TO_DATE('01/01/2009','DD/MM/YYYY'));
執行後查詢 DBA_SEGMENTS 可見:
DBOBJS_08(預設表空間 EYGLE)DBOBJS_08(預設表空間 USERS)ALTER TABLE ADD PARTITION 會自動維護本地索引,零停機擴展