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

Oracle 表欄位管理三大實戰技巧:標記 UNUSED、加註釋、重組表

     編輯:Oracle 資料庫基礎

前言:簡化維護的藝術

Oracle 資料庫功能強大但複雜,DBA 若能善用特性技巧,可大幅降低維護風險與業務影響。本文聚焦表欄位管理三大高頻場景:大表刪欄位不停機、文檔化欄位語意、消除碎片提升效能,提供可直接落地的操作指南。

技巧一:SET UNUSED —— 大表刪欄位的「緩衝帶」

痛點場景

某人資系統初期將「員工住址」放入主表,後因地址變更歷史追蹤需求拆分至獨立表。原表已達千萬筆,直接 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 COLUMNSET 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 線上重組,實現真正零停機演進。

技巧二:COMMENT —— 讓資料字典說人話

為何需要註釋

專案並行、人員流動導致「表 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';

關鍵規範

  • 單引號包裹內容,內含單引號需轉義 ''
  • 長度上限 4000 位元組,建議 200 字內,重點突出
  • 支援多行、標點、特殊字元,嚴禁覆蓋歷史註釋,採用追加模式:
    COMMENT ON TABLE t IS '舊註釋 | 2024-03-01 更新: 新增分攤邏輯 by Li';
  • 查詢視圖:USER_TAB_COMMENTS、USER_COL_COMMENTS

技巧三:ALTER TABLE MOVE —— 消除碎片的手術刀

碎片成因與症狀

高頻 DML(INSERT/UPDATE/DELETE)導致:

  • 空間碎片:區塊內可用空間分散,無法容納新行
  • 行遷移:UPDATE 導致行長度超過區塊剩餘空間,行移至新區塊留下指標,全表掃描時產生額外 I/O

典型徵兆: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 重建

關鍵注意事項

  1. 空間預留:目標表空間需容納「原表大小 + 索引大小」
  2. 鎖定影響:移動期間持有排他鎖,務必安排維護窗口或使用 DBMS_REDEFINITION 線上重組
  3. 統計資訊:移動後立即收集統計資訊 DBMS_STATS.GATHER_TABLE_STATS
  4. 全域索引:12c+ 支援 UPDATE 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 MOVEDBMS_REDEFINITION 線上重組

善用這三招,讓表結構演進可控、文檔即時、儲存高效,是資深 DBA 與初級運維的分水嶺。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved