SELECT ... FROM (
SELECT * FROM table
WHERE column10=0
AND (column11 IS NULL OR column11 <= SYSDATE)
AND (column12=100 AND (TO_CHAR(SYSDATE,'HH24') BETWEEN '08' AND '11'
OR TO_CHAR(SYSDATE,'HH24') BETWEEN '14' AND '20'))
) WHERE ROWNUM < 100 ORDER BY column12, column13 DESC;
TO_CHAR(SYSDATE,...) 導致無法使用索引範圍掃描。column11 IS NULL 亦阻礙索引使用。AND ( (TRUNC(SYSDATE) + 8/24 <= SYSDATE AND SYSDATE < TRUNC(SYSDATE) + 12/24)
OR (TRUNC(SYSDATE) + 14/24 <= SYSDATE AND SYSDATE < TRUNC(SYSDATE) + 21/24) )
DEFAULT DATE '1900-01-01',查詢改為 column11 <= SYSDATE。CREATE INDEX idx_table_10_11_12_13 ON table(column10, column11, column12, column13);
收集執行計劃(EXPLAIN PLAN),確認 INDEX RANGE SCAN、COUNT STOPKEY 出現,邏輯讀大幅下降。|