Oracle 資料庫作為企業級核心數據存儲系統,廣泛應用於金融、電信、電力、民航等高吞吐量領域。隨著業務持續運行,資料庫碎片逐漸累積,成為影響性能的關鍵因素。本文深入解析碎片產生機制、性能影響、量化指標(FSFI)及整理方案,助力 DBA 掌握核心維護技能。
Oracle 存儲結構自大到小依次為:
理想狀態下,一個段僅佔用單一區塊,數據緊湊存儲。但現實中:
pctincrease > 0 的區塊FSFI = 100 × √(MAX_EXTENT / SUM_EXTENTS) × 1 / √√(COUNT_EXTENTS)
-- fsfi.sql
COLUMN FSFI FORMAT 999.99
SELECT tablespace_name,
SQRT(MAX(blocks)/SUM(blocks)) * (100/SQRT(SQRT(COUNT(blocks)))) AS FSFI
FROM dba_free_space
GROUP BY tablespace_name
ORDER BY 1;
SPOOL fsfi.rep;
/
SPOOL OFF;
| 表空間 | FSFI | 狀態評估 |
|---|---|---|
| SYSTEM | 100.00 | 優秀,單一區塊 |
| USERS | 100.00 | 優秀 |
| TOOLS | 75.79 | 良好 |
| RBS | 74.06 | 良好 |
| YDJF_IDX | 75.55 | 良好 |
| YDCX_IDX | 57.19 | 需關注 |
| YDCX_DATA | 47.34 | 需關注 |
| YDJF_DATA | 33.80 | 臨界值,建議整理 |
| TEMP | 22.82 | 嚴重碎片,必須整理 |
設定表空間預設儲存參數 pctincrease > 0(建議設為 1):
ALTER TABLESPACE temp DEFAULT STORAGE (PCTINCREASE 1);
ALTER TABLESPACE temp COALESCE;
此命令會合併相鄰自由區塊,不移動段數據,線上可執行。
-- 查看用戶段資訊
SELECT segment_name, tablespace_name, bytes, blocks, extents
FROM user_segments
WHERE segment_type IN ('TABLE', 'INDEX')
ORDER BY extents DESC;
-- 統計表空間段分佈
SELECT tablespace_name,
COUNT(*) AS obj_count,
ROUND(SUM(bytes)/1024/1024/1024, 2) AS size_gb,
SUM(blocks) AS total_blocks,
SUM(extents) AS total_extents
FROM dba_segments
GROUP BY ROLLUP(tablespace_name);
最徹底的壓縮方法:導出→刪除→導入
-- 1. 導出(compress=Y 將初始區塊設為總大小)
exp user/password file=exp.dmp compress=Y grants=Y indexes=Y tables=(table1,table2)
-- 2. 刪除原表
DROP TABLE table1;
DROP TABLE table2;
-- 3. 導入(數據將緊湊存入單一大區塊)
imp user/password file=exp.dmp commit=Y buffer=64000 full=Y
碎片整理是 DBA 核心維護職責之一。通過 FSFI 量化指標指導決策,結合 COALESCE、重建段、Online Redefinition 等手段,可有效維持資料庫存儲健康度,保障業務系統穩定高效運行。建議建立碎片管理 SOP,從被動修復轉向主動預防。