Oracle 資料庫功能強大但複雜,DBA 若能善用特性技巧,可大幅降低維護風險與業務影響。本文聚焦表欄位管理三大高頻場景:大表刪欄位不停機、文檔化欄位語意、消除碎片提升效能,提供可直接落地的操作指南。
某人資系統初期將「員工住址」放入主表,後因地址變更歷史追蹤需求拆分至獨立表。原表已達千萬筆,直接 ALTER TABLE ... DROP COLUMN address 需全表掃描重寫每列資料,耗時數小時並產生大量 REDO/UNDO,高峰期執行將嚴重阻塞業務。
-- 階段 1:高峰期安全標記(秒級完成,僅更新字典)
ALTER TABLE employees SET UNUSED COLUMN address;
-- 階段 2:維護窗口物理清除(可並行、可分批)
ALTER TABLE employees DROP UNUSED COLUMNS CHECKPOINT 1000;
| 維度 | DROP COLUMN | SET UNUSED + DROP UNUSED COLUMNS |
|---|---|---|
| 執行時間 | 與資料量成正比(小時級) | 標記:毫秒級;清除:可控窗口 |
| 空間釋放 | 即時 | 清除階段釋放 |
| 業務影響 | 高(排他鎖、大量 REDO) | 極低(字典操作) |
| 欄位名重用 | 立即可用 | 標記後即可重用 |
| 可見性 | 立即消失 | 標記後立即不可見 |
SELECT * FROM user_unused_col_tabs; -- 追蹤所有 UNUSED 欄位
-- 定期維護窗口批次清除
BEGIN
FOR r IN (SELECT table_name FROM user_unused_col_tabs) LOOP
EXECUTE IMMEDIATE 'ALTER TABLE ' || r.table_name || ' DROP UNUSED COLUMNS CHECKPOINT 500';
END LOOP;
END;
/
最佳實踐:建立季度清除排程,結合 DBMS_REDEFINITION 線上重組,實現真正零停機演進。
專案並行、人員流動導致「表 TMP_FIN_01、欄位 COL_X3」充斥系統。命名規範無法承載完整業務語境,註釋是零成本、高可用的即時文檔。
-- 表級註釋
COMMENT ON TABLE fin_transactions IS
'財務交易主表 | 建立: 2023-01-15 by Chen | 用途: 核心帳務記帳 | 關聯: GL_ACCOUNTS, COST_CENTERS | 保留: 10 年';
-- 欄位級註釋(建議包含四要素)
COMMENT ON COLUMN fin_transactions.txn_amt IS
'交易金額 | 單位: 分(避免浮點) | 正負: 借方正/貸方負 | 來源: 前端輸入/介面轉入 | 更新: 僅冲銷可改 | 索引: IDX_FIN_TXN_AMT';
''COMMENT ON TABLE t IS '舊註釋 | 2024-03-01 更新: 新增分攤邏輯 by Li';USER_TAB_COMMENTS、USER_COL_COMMENTS高頻 DML(INSERT/UPDATE/DELETE)導致:
典型徵兆:TABLE FETCH CONTINUED ROW 統計值飆升、全表掃描效能退化、實際資料量遠小於段大小。
-- 同表空間移動(需 2 倍空間暫存)
ALTER TABLE orders MOVE TABLESPACE users_data;
-- 跨表空間移動(建議:不同磁碟組分離索引/資料)
ALTER TABLE orders MOVE TABLESPACE users_data_ssd;
-- 移動後必須重建索引(ROWID 改變導致 UNUSABLE)
ALTER INDEX idx_orders_cust REBUILD;
ALTER INDEX idx_orders_dt REBUILD ONLINE; -- 企業版支援 ONLINE 重建
DBMS_REDEFINITION 線上重組DBMS_STATS.GATHER_TABLE_STATSUPDATE INDEXES 子句同步維護全域索引SELECT segment_name, bytes/1024/1024 mb, blocks, empty_blocks
FROM user_segments
WHERE segment_type = 'TABLE' AND bytes > 100*1024*1024
ORDER BY empty_blocks/blocks DESC; -- 空區塊比例高者優先處理
| 場景 | 首選技巧 | 輔助技巧 |
|---|---|---|
| 大表刪欄位 | SET UNUSED | 維護窗 DROP UNUSED COLUMNS |
| 新成員接手/審計 | COMMENT 完善 | 自動化文檔產生腳本 |
| 效能退化/空間浪費 | ALTER TABLE MOVE | DBMS_REDEFINITION 線上重組 |
善用這三招,讓表結構演進可控、文檔即時、儲存高效,是資深 DBA 與初級運維的分水嶺。