首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 索引常見誤區與優化實戰:避開濫用陷阱、提升 DML 效能

     編輯:Oracle 資料庫相關知識

索引能加速查詢,但濫用會拖垮寫入效能、佔用空間、甚至誤導優化器。本文歸納四大常見誤區與對應解法,並補充「索引失效/重建」運維技巧,助您建立精準索引策略。

一、四大常見誤區

誤區現象根因解法
1. 聚合函數不走索引COUNT(1)、AVG/SUM/MIN/MAX(col) 全表掃描索引含 NULL 值,聚合需掃描所有列;COUNT(*) 更不走索引COUNT(col) 無解;AVG/SUM/MIN/MAX 加 WHERE col IS NOT NULL 可觸發 INDEX FAST FULL SCAN
2. MIN/MAX 同查不走索引SELECT MIN(col), MAX(col) FROM t 全表掃描優化器未將雙聚合合併為雙索引掃描拆分兩條查詢:SELECT MIN(col) FROM t WHERE col IS NOT NULL / SELECT MAX(col) FROM t WHERE col IS NOT NULL,各自走索引
3. 回表存取查詢非索引欄位產生 TABLE ACCESS BY INDEX ROWID索引未覆蓋查詢欄位若非必要勿查非索引欄位;必要時建立覆蓋索引 (Composite Index 含所有查詢欄位)
4. 索引越多越好INSERT/UPDATE/DELETE 變慢、空間暴增每個索引皆需同步維護;重複索引 (單欄+組合首欄相同) 浪費資源定期檢視 DBA_INDEXES、V$OBJECT_USAGE (監控用法);若組合索引首欄 = 單欄索引,評估移除單欄索引

二、運維技巧:大量 DML 時暫時停用索引

-- 1. 設為 UNUSABLE (停用,不刪除定義)
ALTER INDEX idx_name UNUSABLE;
-- 或分區索引
ALTER INDEX idx_name MODIFY PARTITION p202401 UNUSABLE;

-- 2. 執行大量載入/刪除/更新
-- ... 大批次 DML ...

-- 3. 重建索引 (線上可用 ONLINE)
ALTER INDEX idx_name REBUILD ONLINE;
-- 分區
ALTER INDEX idx_name REBUILD PARTITION p202401 ONLINE;

優點:避免 DML 時索引維護開銷;重建後統計資訊自動收集 (10g+),索引高度優化。

注意:UNUSABLE 期間查詢不可用該索引,應用需配合 (如切換至全表掃描 Hint)。

三、生產環境操作原則

  1. 低業務時段操作 (凌晨維護窗口)。
  2. 先在測試環境驗證腳本、評估時間。
  3. 備份索引定義 (DBMS_METADATA.GET_DDL) 以備回滾。
  4. 監控 V$SESSION_LONGOPS 追蹤重建進度。

四、索引設計黃金法則

  • 高選擇性優先:唯一鍵、近似唯一欄位 (如身分證、手機號) 最適合 B-tree。
  • 低選擇性用 Bitmap:性別、狀態碼、少數枚舉值,適合 Bitmap Index (數倉/OLAP 環境)。
  • 組合索引遵循「最左前綴」:INDEX (a,b,c) 支援 WHERE a=...、WHERE a=... AND b=...、WHERE a=... AND b=... AND c=...。
  • 函數索引解決運算列查詢:CREATE INDEX idx_upper_name ON emp(UPPER(ename)) 支援 WHERE UPPER(ename) = 'KING'。
  • 定期收集統計資訊:DBMS_STATS.GATHER_TABLE_STATS(..., CASCADE=>TRUE) 同步更新索引統計。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved