回覆列表
  • 1 # 使用者8107137581681

    Oracle中我們經常使用Date欄位型別記錄日期和時間,有的時候還在這個欄位上建立索引。

    然後透過Java程式訪問資料庫的時候,我們很自然的類似這樣使用:select * from table where endDate>? and endDate<?,然後透過PreparedStatement預編譯,再透過setTimestamp傳入由java.util.Date轉成java.sql.Timestamp的引數(因為java.sql.Date只有日期,java.sql.Time只有時間,所以我們只能用java.sql.Timestamp型別)。我們會認為這樣應該走索引區間掃描,效率應該是非常高的。

    而事實上,Oracle會把sql解釋成如下這樣來執行:select * from table where TO_TIMESTAMP(endDate)>? and TO_TIMESTAMP(endDate)<?; 為什麼?因為傳入的引數是timestamp型別,Oracle從9.2版本以後支援這種型別,所以Oracle做了這樣的轉換,結果就是這個SQL執行變成了全表掃描。我們做的試驗,加了一個index hint,強制走時間索引欄位,結果效率也不高,sql執行變成了全索引掃描,和全表掃描沒多大區別。結果效率還是低。

    不光直接使用JDBC會是這樣,Spring,iBatis在處理傳入引數是java.util.Date型別的時候,都會使用setTimestamp設定引數,所以都需要注意。

  • 中秋節和大豐收的關聯?
  • 粉色的花怎樣形容?