ORDER BY 僅在兩種嚴格條件下使用索引:
WHERE 使用的索引與 ORDER BY 使用的索引不能並列 (無法同時滿足)。
-- 數值索引欄位比較字串
WHERE empno = '123'
-- Oracle 內部轉換:WHERE empno = TO_NUMBER('123')
-- 索引仍可使用 (轉換發生在常數端)
-- 字元索引欄位比較數值
WHERE emp_type = 123
-- Oracle 內部轉換:WHERE TO_NUMBER(emp_type) = 123
-- 索引失效!轉換發生在欄位端
WHERE emp_type = TO_CHAR(123)| 模式 | 範例 | 原因 | |
|---|---|---|---|
| 不等於 (!= / <>) | WHERE status != 'A' | 索引只知「有什麼」,不知「沒什麼」 | |
| 字串連接 (||) | WHERE first_name || last_name = 'JohnDoe' | 函數操作導致索引失效 | |
| 數學運算 (+ - * /) | WHERE salary * 12 > 50000 | 運算發生在欄位端 | |
| 索引欄互相比較 | WHERE col1 = col2 | 觸發全表掃描 | |
| 隱含型別轉換 | WHERE char_col = 123 | 欄位端函數化 | |
| IS NULL / IS NOT NULL | WHERE idx_col IS NULL | 單欄索引不存 NULL |
| 操作 | 觸發排序 | 排序次數 | 替代建議 |
|---|---|---|---|
| DISTINCT | 是 | 1 | EXISTS、GROUP BY |
| UNION | 是 | ≥2 | UNION ALL (業務允許) |
| MINUS | 是 | ≥2 | NOT EXISTS、LEFT JOIN |
| INTERSECT | 是 | ≥2 | INNER JOIN、EXISTS |
| ORDER BY | 是 | 1 | 索引順序讀取、應用端排序 |