坑描述: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類型)這兩個函數的使用。