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

Oracle 性能優化鐵律一:避免 WHERE 條件中對欄位進行運算導致索引失效

     編輯:Oracle 教學

Oracle 性能優化鐵律一:避免 WHERE 條件中對欄位進行運算導致索引失效

核心原則

任何對欄位的運算(函數、表達式、類型轉換)都會導致該欄位索引失效,迫使全表掃描。

原因:運算結果需在執行時逐行計算,優化器無法在編譯期利用索引預估選擇性。

反面教材(慢 SQL)

原始 SQL (30 萬行,耗時 10-13 秒)問題
WHERE SUBSTRB(CardNo,1,4) = '5378'函數運算
WHERE amount/30 < 1000算術運算
WHERE TO_CHAR(ActionTime,'yyyymmdd') = '19991201'轉換函數

正確改寫(亞秒級)

優化後 SQL技巧
WHERE CardNo LIKE '5378%'前綴匹配可用索引
WHERE amount < 1000*30常數折疊移至右側
WHERE ActionTime = TO_DATE('19991201','yyyymmdd')常數轉換而非欄位轉換

延伸檢查清單

  • NVL(col,0)、COALESCE(col,0) → 改用 col IS NULL OR col = 0 或函數索引
  • TRUNC(date_col) → 改用 date_col >= TRUNC(SYSDATE) AND date_col < TRUNC(SYSDATE)+1
  • 隱式類型轉換:WHERE num_col = '123' → 明確 TO_NUMBER 或修正應用層參數綁定類型
  • 建立函數索引 (FBI) 針對無法改寫的高頻函數條件:CREATE INDEX idx_fbi ON t(UPPER(name));

驗證方法

EXPLAIN PLAN FOR ;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- 觀察 Operation 是否為 INDEX RANGE SCAN vs TABLE ACCESS FULL
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved