WHERE 子句對欄位使用 UPPER、REPLACE、SUBSTR 等函數時,Oracle 優化器無法使用該欄位上的標準 B-tree 索引,導致全表掃描。
SELECT address FROM address WHERE UPPER(name) LIKE 'JOHN';
SELECT address FROM address
WHERE UPPER(name) LIKE 'JOHN'
AND (name LIKE 'J%' OR name LIKE 'j%');
name LIKE 'J%' OR name LIKE 'j%' 未使用函數,可走索引範圍掃描。CONCATENATION 合併結果。JO%、Jo%、jO% 等組合,進一步縮小掃描範圍。WHERE REPLACE(REPLACE(phone_number, '-'), ' ') = '1234567890'
WHERE REPLACE(REPLACE(phone_number, '-'), ' ') = '1234567890'
AND phone_number LIKE '123%'
(123) 456-7890,擴充條件:
AND (phone_number LIKE '123%' OR phone_number LIKE '(123%')
LIKE 'prefix%' 或 = 'value' 條件。AND 連接原條件與新條件,確保結果集不變。INDEX RANGE SCAN + CONCATENATION。DECODE、CASE)。