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

Oracle WHERE 子句索引使用鐵律:型別轉換、失效模式與資源耗盡操作避坑指南

     編輯:Oracle 資料庫基礎

ORDER BY 與索引的嚴格條件

ORDER BY 僅在兩種嚴格條件下使用索引:

  1. ORDER BY 所有欄位包含於同一索引,且順序與索引定義順序一致
  2. ORDER BY 所有欄位定義為 NOT NULL

WHERE 使用的索引與 ORDER BY 使用的索引不能並列 (無法同時滿足)。

隱含型別轉換:索引殺手

-- 數值索引欄位比較字串
WHERE empno = '123' 
-- Oracle 內部轉換:WHERE empno = TO_NUMBER('123') 
-- 索引仍可使用 (轉換發生在常數端)

-- 字元索引欄位比較數值
WHERE emp_type = 123
-- Oracle 內部轉換:WHERE TO_NUMBER(emp_type) = 123
-- 索引失效!轉換發生在欄位端
  • 字元 vs 數值比較:Oracle 優先將數值轉字元
  • 最佳實踐:顯式轉換,WHERE emp_type = TO_CHAR(123)

WHERE 子句索引失效六大模式

全表掃描不一定是壞事

  • 存取比例 > 30% 表列數時,全表掃描往往優於索引
  • 特定情況索引反而較慢 (同數量級差異)
  • 通常索引快「幾倍到幾千倍」

資源耗盡操作:識別與替代

模式範例原因
不等於 (!= / <>)WHERE status != 'A'索引只知「有什麼」,不知「沒什麼」
字串連接 (||)WHERE first_name || last_name = 'JohnDoe'函數操作導致索引失效
數學運算 (+ - * /)WHERE salary * 12 > 50000運算發生在欄位端
索引欄互相比較WHERE col1 = col2觸發全表掃描
隱含型別轉換WHERE char_col = 123欄位端函數化
IS NULL / IS NOT NULLWHERE idx_col IS NULL單欄索引不存 NULL

若 SORT_AREA_SIZE 配置良好,UNION/MINUS/INTERSECT 可接受 (可讀性佳)。

綜合避坑清單

  1. 所有 WHERE 條件欄位顯式型別轉換
  2. 索引欄位遠離函數、運算、NOT、||、IS NULL
  3. 複合索引確保 WHERE 含首欄
  4. 大表聯結優先用 EXISTS/NOT EXISTS
  5. 全表掃描不可怕,需根據存取比例判斷
  6. 排序操作評估必要性,能避則避
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
操作觸發排序排序次數替代建議
DISTINCT是1EXISTS、GROUP BY
UNION是≥2UNION ALL (業務允許)
MINUS是≥2NOT EXISTS、LEFT JOIN
INTERSECT是≥2INNER JOIN、EXISTS
ORDER BY是1索引順序讀取、應用端排序