oracle让时间范围走索引,怎样让日期范围走索引?
满意答案
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让时间范围走索引,怎样让日期范围走索引?相关推荐
- Oracle 中的 TO_DATE 和 TO_CHAR 函数 日期处理
Oracle 中的 TO_DATE 和 TO_CHAR 函数 日期处理 Oracle 中的 TO_DATE 和 TO_CHAR 函数 oracle 中 TO_DATE 函数的时间格式,以 2008-0 ...
- Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)
理解oracle索引扫描类型的特点以及具体触发的条件,对于通过合理地使用索引,进行sql优化至关重要(例如组合索引的引导列的选择问题). 在总结索引扫描类型前,需要再次强调关于索引特点的几个关键点: ...
- mysql 日期能用索引_mysql 日期与索引问题
日期类型可以直接和string格式的字符串比较 select * from xxx where event_time>'2018-06-02' 可以使用索引, mysql默认会把后面的字符串转成 ...
- pandas使用reindex函数为日期索引中有缺失日期的dataframe进行索引重置(所有日期都连续)、并使用fill_value参数为行进行默认填充
pandas使用reindex函数为日期索引中有缺失日期的dataframe进行索引重置(所有日期都连续).并使用fill_value参数为行进行默认填充(add the missing date i ...
- Oracle数据库对象,同义词、序列、视图、索引
数据库对象简介 Oracle 数据库对象又称模式对象 数据库对象是逻辑结构的集合,最基本的数据库对象是表 其他数据库对象包括: 同义词是现有对象的一个别名. 简化SQL语句 隐藏对象的名称和所有者 提 ...
- oracle 伪列访问序列,Oracle数据库对象,同义词、序列、视图、索引
数据库对象简介 Oracle 数据库对象又称模式对象 数据库对象是逻辑结构的集合,最基本的数据库对象是表 其他数据库对象包括: 同义词是现有对象的一个别名. 简化SQL语句 隐藏对象的名称和所有者 提 ...
- oracle全局索引 效率,关于插入,全局索引和局部索引的情况,那种效率高
分区表上的索引 表可以按range,hash,list分区,表分区后,其上的索引和普通表上的索引有所不同,oracle对于分区表上的索引分为2类,即局部索引和全局索引,下面分别对这2种索引的特点和局限 ...
- 查询没有走索引_MySQL 如何正确的使用索引
学习索引,主要是写出更快的sql,当我们写sql的时候,需要明确的知道sql为什么会走索引?为什么有些sql不走索引?sql会走那些索引,为什么会这么走?我们需要了解其原理,了解内部具体过程,这样使用 ...
- mysql左模糊 走索引_mysql的模糊查找是否走索引问题
2019独角兽企业重金招聘Python工程师标准>>> 在数据库中索引对于查找是非常有用的,楼主做了两个实验,插入数据的时候非常慢,楼主是这样实验的: 一:数据库列的索引 ①:首先执 ...
最新文章
- 5 zabbix 添加host_运维监控实战篇,zabbix自动发现和自动注册图文详解
- 仿写thinkphp的I方法
- 【Python基础】Pandas向量化字符串操作
- Harfbuzz API 基本用法
- 协同过滤——基于模型的算法
- Elasticsearch——分词器对String的作用
- linux软件包安装及自制yum源
- 月薪2万程序员面试,被HR直面吐槽:毕业生能值这个数?
- 企业服务器上病房床号修改,关于医院病房安放陪护床(共享陪护床)申请报告...
- MUI框架开发HTML5手机APP(一)--搭建第一个手机APP
- 谢谢有你【我与51CTO一“七”成长】
- Python之random.seed()用法
- vocabulary
- CS294(285)策略梯度学习笔记
- Unity中使用的四种存档和读档方式
- 学生评教系统--教师评教
- 嵌入式Linux自学笔记(二)——文件IO
- 【Java】Java中GUI之布局管理器
- Https比Http速度慢具体分析
- C++编程永不过时的语言,原因何在?