採用本地管理表空間(LMT),合理設定區段初始大小與擴展策略,監控即將擴展的區段:
SELECT owner, table_name, blocks, empty_blocks
FROM dba_tables
WHERE empty_blocks / (blocks + empty_blocks) < 0.1;
HWM 記錄於區段標頭區塊,隨資料插入以 5 區塊為單位增長。TRUNCATE 可重置 HWM,DELETE 則不行。全表掃描會讀取 HWM 以下所有區塊,HWM 以上空間雖不影響性能但浪費儲存。
回收 HWM 以上空間: ALTER TABLE ... DEALLOCATE UNUSED;
降低 HWM(整理碎片): 匯出/匯入、ALTER TABLE ... MOVE(需重建索引)。
ANALYZE TABLE schema.table_name COMPUTE STATISTICS;
SELECT num_rows, blocks, empty_blocks, avg_space, chain_cnt, avg_row_len
FROM dba_tables WHERE owner='...' AND table_name='...';
| 參數 | 預設 | 適用場景 | 計算公式 |
|---|---|---|---|
| PCTFREE | 10% | 預留更新空間,無 UPDATE 活動可設 0 | 100 × 平均更新增量 / 平均列長 |
| PCTUSED | 40% | 有 DELETE 活動時設定 | 100 - PCTFREE - 100 × 刪除列數 × 平均列長 / 區塊大小 |
兩者皆降低 DML 性能、增加索引查詢 I/O。
ANALYZE TABLE table_name LIST CHAINED ROWS;
SELECT owner_name, table_name, head_rowid FROM chained_rows WHERE table_name='...';
CHAINED_ROWS 表(@?/rdbms/admin/utlchain)。ANALYZE TABLE ... LIST CHAINED ROWS;ANALYZE INDEX idx_name VALIDATE STRUCTURE;
SELECT name, (del_lf_rows_len / lf_rows_len) * 100 AS waste_pct FROM index_stats;
浪費空間超過 20% 時建議 ALTER INDEX ... REBUILD;或用 COALESCE 整理葉區塊。
ALTER INDEX idx_name MONITORING USAGE;
-- 一段時間後 --
ALTER INDEX idx_name NOMONITORING USAGE;
SELECT index_name, used FROM v$object_usage;
刪除長期未使用的索引可降低 DML 開銷。