使用timeStamp查询date格式的数据库字段索引失效

背景

一次大表查询的过程中,为防止数据量太大,使用了timestamp作为查询条件来过滤一个数据库类型为date的字段,如下图所示: select * from t_xxx t where t.transdate>=timestamp '2024-11-22 00:00:00' and t.transdate<=timestamp '2024-11-22 59:59:59' 此处transdate在数据库数据类型为date类型 发现搜索时间比较长,通过explain plan 发现是transdate过滤的时候,走了全表查询

------------------------------------------------------------------------------------------------
| Id  | Operation                | Name                | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|*  5 |      TABLE ACCESS FULL   | S3_ACCOUNTSTATEMENT |    42 |  2562 |  1060   (1)| 00:00:01 |
------------------------------------------------------------------------------------------------

原因

通过分析发现当使用 select * from t_xxx t where t.transdate>=to_date(yyyy-MM-dd HH:mm:ss,'2024-11-22 00:00:00')and t.transdate<=to_date(yyyy-MM-dd HH:mm:ss,'2024-11-22 59:59:59') 性能明显提升,命中的索引,通过分析得知:transdate字段类型是Date,不支持对 timestamp值进行精确匹配,故索引失效

解决方式

将字段转换为date,再去查询数据库