1. 程式人生 > >oracle的Date型別遇到MyBatis產生的坑

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型別)這兩個函式的使用。