满意答案

Oracle中我们经常使用Date字段类型记录日期和时间,有的时候还在这个字段上建立索引。

然后通过Java程序访问数据库的时候,我们很自然的类似这样使用:select * from table where endDate>? and endDate,然后通过PreparedStatement预编译,再通过setTimestamp传入由java.util.Date转成java.sql.Timestamp的参数(因为java.sql.Date只有日期,java.sql.Time只有时间,所以我们只能用java.sql.Timestamp类型)。我们会认为这样应该走索引区间扫描,效率应该是非常高的。

而事实上,Oracle会把sql解释成如下这样来执行:select * from table where TO_TIMESTAMP(endDate)>? and TO_TIMESTAMP(endDate); 为什么?因为传入的参数是timestamp类型,Oracle从9.2版本以后支持这种类型,所以Oracle做了这样的转换,结果就是这个SQL执行变成了全表扫描。我们做的试验,加了一个index hint,强制走时间索引字段,结果效率也不高,sql执行变成了全索引扫描,和全表扫描没多大区别。结果效率还是低。

不光直接使用JDBC会是这样,Spring,iBatis在处理传入参数是java.util.Date类型的时候,都会使用setTimestamp设定参数,所以都需要注意。

解决办法(四种解决办法,推荐方案一):

1.sql修改成这样:select * from table where endDate>to_date(?,’yyyymmddhh24miss’) and endDate

2.在建立数据库连接的时候增加一个属性oracle.jdbc.V8Compatible=true,代码如下:

Properties prop=new Properties();

prop.setProperty(“user”,”****”);

prop.setProperty(“password”,”****”);

prop.setProperty(“oracle.jdbc.V8Compatible”,”true”);

Connection connection = DriverManager.getConnection(“jdbc:oracle:thin:@127.0.0.1:1521:test”, prop);

连接池也根据各自的配置方式增加这个属性即可。目前看来这个属性参数是处理时间映射关系的,但是还不确定它是否会带来其他的问题,所以要慎重使用。

3.修改数据库列类型为timestamp类型。

4.依据网上资料,Oracle 11g修改了驱动 api,使用方式可能也会有改变。因为无法试验,所以也不确定具体细节。

00分享举报

oracle让时间范围走索引,怎样让日期范围走索引?相关推荐

  1. Oracle 中的 TO_DATE 和 TO_CHAR 函数 日期处理

    Oracle 中的 TO_DATE 和 TO_CHAR 函数 日期处理 Oracle 中的 TO_DATE 和 TO_CHAR 函数 oracle 中 TO_DATE 函数的时间格式,以 2008-0 ...

  2. Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)

    理解oracle索引扫描类型的特点以及具体触发的条件,对于通过合理地使用索引,进行sql优化至关重要(例如组合索引的引导列的选择问题). 在总结索引扫描类型前,需要再次强调关于索引特点的几个关键点: ...

  3. mysql 日期能用索引_mysql 日期与索引问题

    日期类型可以直接和string格式的字符串比较 select * from xxx where event_time>'2018-06-02' 可以使用索引, mysql默认会把后面的字符串转成 ...

  4. pandas使用reindex函数为日期索引中有缺失日期的dataframe进行索引重置(所有日期都连续)、并使用fill_value参数为行进行默认填充

    pandas使用reindex函数为日期索引中有缺失日期的dataframe进行索引重置(所有日期都连续).并使用fill_value参数为行进行默认填充(add the missing date i ...

  5. Oracle数据库对象,同义词、序列、视图、索引

    数据库对象简介 Oracle 数据库对象又称模式对象 数据库对象是逻辑结构的集合,最基本的数据库对象是表 其他数据库对象包括: 同义词是现有对象的一个别名. 简化SQL语句 隐藏对象的名称和所有者 提 ...

  6. oracle 伪列访问序列,Oracle数据库对象,同义词、序列、视图、索引

    数据库对象简介 Oracle 数据库对象又称模式对象 数据库对象是逻辑结构的集合,最基本的数据库对象是表 其他数据库对象包括: 同义词是现有对象的一个别名. 简化SQL语句 隐藏对象的名称和所有者 提 ...

  7. oracle全局索引 效率,关于插入,全局索引和局部索引的情况,那种效率高

    分区表上的索引 表可以按range,hash,list分区,表分区后,其上的索引和普通表上的索引有所不同,oracle对于分区表上的索引分为2类,即局部索引和全局索引,下面分别对这2种索引的特点和局限 ...

  8. 查询没有走索引_MySQL 如何正确的使用索引

    学习索引,主要是写出更快的sql,当我们写sql的时候,需要明确的知道sql为什么会走索引?为什么有些sql不走索引?sql会走那些索引,为什么会这么走?我们需要了解其原理,了解内部具体过程,这样使用 ...

  9. mysql左模糊 走索引_mysql的模糊查找是否走索引问题

    2019独角兽企业重金招聘Python工程师标准>>> 在数据库中索引对于查找是非常有用的,楼主做了两个实验,插入数据的时候非常慢,楼主是这样实验的: 一:数据库列的索引 ①:首先执 ...

最新文章

  1. 5 zabbix 添加host_运维监控实战篇,zabbix自动发现和自动注册图文详解
  2. 仿写thinkphp的I方法
  3. 【Python基础】Pandas向量化字符串操作
  4. Harfbuzz API 基本用法
  5. 协同过滤——基于模型的算法
  6. Elasticsearch——分词器对String的作用
  7. linux软件包安装及自制yum源
  8. 月薪2万程序员面试,被HR直面吐槽:毕业生能值这个数?
  9. 企业服务器上病房床号修改,关于医院病房安放陪护床(共享陪护床)申请报告...
  10. MUI框架开发HTML5手机APP(一)--搭建第一个手机APP
  11. 谢谢有你【我与51CTO一“七”成长】
  12. Python之random.seed()用法
  13. vocabulary
  14. CS294(285)策略梯度学习笔记
  15. Unity中使用的四种存档和读档方式
  16. 学生评教系统--教师评教
  17. 嵌入式Linux自学笔记(二)——文件IO
  18. 【Java】Java中GUI之布局管理器
  19. Https比Http速度慢具体分析
  20. C++编程永不过时的语言,原因何在?

热门文章

  1. 小白的渗透之旅1-DVWA环境搭建
  2. 腾讯搜搜高管吴军离职的传闻与真相
  3. Lesson 20 Pioneer pilots 内容鉴赏
  4. Go语言云原生与微服务(一)云原生架构
  5. jenkins 使用过程问题解决方法
  6. Hive学习之抽样(tablesample)
  7. RF MEMS开关时代将开启-30?
  8. PMP需要提供什么资料来证明自己的项目管理经验
  9. 年终总结——思考,沉淀
  10. 武大博士后出站后应聘在社区做社工引热议,内卷还是人各有志?