oracle的Date型別遇到MyBatis產生的坑
坑描述:
公司的訂單表資料量巨大(億級),在進行查詢的時候,發現一個慢查詢。
背景:
資料庫:oracle
表:T_order
索引欄位:create_date (欄位型別 date)
慢查詢sql:
select * from T_order where create_date >= #{parameterDate}
慢查詢的原因:
如果JAVA中的屬性為DATE,而資料庫中是DATE型別的話,mybatis會預設將JAVA中DATE屬性對映到資料庫的Timestamp型別。此時欄位 create_date 為date型別,引數parameterDate為timestamp型別,兩者的型別不一致。oracle資料庫會date型別轉換為timestamp型別(精確度小的型別轉換為精確度大的型別),因此實際執行的sql語句為:select * from T_order where to_timestamp(create_date ) >= #{parameterDate} 導致左邊的列用到函式。即索引列上使用函式後會導致索引失效,這樣一來就全表掃描了訂單庫,造成慢sql。
解決方法:
原因以及知道了,解決起來就容易了。
修改後的sql為:
select * from T_order where create_date >= cast(#{parameterDate} as date)
注意的點:
1、索引的使用。
2、MyBatis的型別轉換。
3、oracle的型別轉換。
4、to_timestamp(將date型別轉換為Timestamp型別),cast(將某種資料型別的表示式顯式轉換為另一種資料型別,在此將Timestamp轉換為date型別)這兩個函式的使用。