oracle的Date類型遇到MyBatis產生的坑

坑描述:sql

  公司的訂單表數據量巨大(億級),在進行查詢的時候,發現一個慢查詢。數據庫

  背景:mybatis

    數據庫:oracleoracle

    表:T_order 函數

    索引字段:create_date  (字段類型 date)spa

  慢查詢sql:索引

    select * from T_order where create_date >= #{parameterDate}ast

  慢查詢的緣由:date

    若是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。select

  解決方法:

    緣由以及知道了,解決起來就容易了。

    修改後的sql爲:

      select * from T_order where create_date >= cast(#{parameterDate} as date)  

注意的點:

  一、索引的使用。

  二、MyBatis的類型轉換。

  三、oracle的類型轉換。

  四、to_timestamp(將date類型轉換爲Timestamp類型),cast(將某種數據類型的表達式顯式轉換爲另外一種數據類型,在此將Timestamp轉換爲date類型)這兩個函數的使用。

相關文章
相關標籤/搜索