首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 分區表與本地索引建管理實戰:從建立、查詢優化到分區維護完整範例

     編輯:Oracle 資料庫基礎

前言

Oracle 分區技術(企業版選購元件)能在特定條件下大幅提升查詢效能。本文透過完整實例,示範範圍分區表建立、本地索引跨表空間配置、資料載入、效能對比(分區 vs 非分區)、新增分區與索引自動維護全流程。

1. 建立範圍分區表

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_NAMEPARTITION_NAMETABLESPACE_NAME
DBOBJSDBOBJS_06EYGLE
DBOBJSDBOBJS_07EYGLE

2. 建立本地索引(指定各分區表空間)

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_NAMEPARTITION_NAMETABLESPACE_NAME
DBOBJS_IDXDBOBJS_06USERS
DBOBJS_IDXDBOBJS_07USERS

3. 載入測試資料與分區裁剪驗證

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 筆

4. 查詢效能對比:分區表 vs 非分區表

分區表查詢計畫 (AUTOTRACE)

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'
  • Consistent Gets:101

非分區表查詢計畫

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(約 26 倍)

效能差異結論

分區裁剪使掃描範圍大幅縮減,Consistent Gets 從 2,670 降至 101,效能提升顯著。隨資料量增長,優勢更明顯。

5. 新增分區與本地索引自動維護

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)

總結

  • 分區表配合本地索引,實現資料與索引同步切分,維運彈性高
  • 分區裁剪大幅減少 I/O 與 Consistent Gets,提升範圍查詢效能
  • ALTER TABLE ADD PARTITION 會自動維護本地索引,零停機擴展
  • 不同分區可存放不同表空間,支援分層儲存策略(熱/冷資料分離)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved