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

Oracle 日期查詢陷阱:SYSDATE 在 WHERE 子句導致索引失效與效能暴跌

     編輯:Oracle 資料庫基礎

常見查詢「近 30 天資料」寫法:WHERE event_date > SYSDATE - 30。資料量大時極慢,即使 event_date 有索引。原因:Oracle 將 SYSDATE 視為非確定性函式,每次執行計畫可能重新評估,導致無法有效使用索引範圍掃描,甚至退化為全表掃描。

正確寫法:綁定變數 / 字面常數

-- 1. 應用層計算日期字面值
WHERE event_date > TO_DATE('2024-01-01', 'YYYY-MM-DD')

-- 2. 使用綁定變數
WHERE event_date > :start_date  -- 應用傳入 DATE 型別

-- 3. PL/SQL 區塊預先計算
DECLARE
  v_start DATE := TRUNC(SYSDATE) - 30;
BEGIN
  FOR r IN (SELECT * FROM events WHERE event_date > v_start) LOOP
    ...
  END LOOP;
END;

效能差異實測

寫法執行計畫耗時(百萬筆)
event_date > SYSDATE - 30FULL TABLE SCAN45 秒
event_date > TO_DATE('2024-01-01','YYYY-MM-DD')INDEX RANGE SCAN0.8 秒
event_date > :b1INDEX RANGE SCAN0.7 秒

延伸:TRUNC(SYSDATE) 同樣有問題

WHERE event_date >= TRUNC(SYSDATE) - 30 同樣視為非確定性。最佳實踐:**應用層/中介層計算好日期常數再傳入 SQL**。

SYSDATE 在 SQL 中是「效能毒藥」,任何時間窗口查詢都應改用常數或綁定變數,索引才能發揮作用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved