文档章节

小坑记-java.util.Date 作为查询条件导致Oracle数据库Date类型的字段索引失效

Fiona_Zhu
 Fiona_Zhu
发布于 2017/05/18 13:42
字数 479
阅读 31
收藏 0

同事在配置报表时,有一张报表查询总是超时,而该段sql放到pl/sql中执行完全没问题,秒出级别的,好吧,自己不知道哪里挖的坑,还是需要自己填的。后来思考了集中可能出现的问题,一一排查:

select A_COLUMN,B_COLUMN,C_COLUMN,TIME_STAMP from TABLEA where TIME_STAMP in (?)

1.强制指定该字段的索引执行,将报表查询sql改为:

       select A_COLUMN,B_COLUMN,C_COLUMN,
       /*+index(A IDX_DFRS_INTERFACE_5M_001)*/
       TIME_STAMP from TABLEA A where   TIME_STAMP in (?)

           执行仍超时!

2.将条件写死执行:

select A_COLUMN,B_COLUMN,C_COLUMN,TIME_STAMP from TABLEA where TIME_STAMP in (to_date('201705171500','yyyyMMddhh24mi'))

           执行成功!

走到这里可以基本推想是Java自动注入后导致索引失效。但是为什么会失效?用其他几千条的表测试是OK的,这个表有3亿+ 近4亿的数据量就不行了。

后来查看代码发现 Date条件是new java.util.Date();那我换成new java.sql.Date()        试了一下,OK了~再换成new java.sql.Time() 也是OK的,那就是这个原因了!

之前只是知道两个Date的应用场景不一样,但是不知道具体会有什么差异,这个小bug让我也学习到了。至于说具体的差别在哪里,翻看源码发现了以下几点:

a). java.sql.Date 继承了 java.util.Date

b). java.sql.Date 注释中描述了这个子类:

A thin wrapper around a millisecond value that allows JDBC to identify this as an SQL DATE  value.

一个允许JDBC去将这个类识别为一个SQL DATE 的关于毫秒值的简单封装。

-------补充-------

既然类本身没有什么特别的地方,那一定是其他地方作了区分,然后看了Oracle驱动包发现,里面会对每种类型进行区分,而对时间的处理正是识别为java.sql.Date|Time.

© 著作权归作者所有

Fiona_Zhu
粉丝 4
博文 11
码字总数 3191
作品 0
浦东
程序员
私信 提问
MYSQL索引失效的各种情形总结

没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询的数量是大表的大部分,应该是30%以上。 4) 索引本身失效 5) 查询条件使用函数在索引列上,或者对索引列进行...

zmf
2014/10/23
0
0
EDB和Oracle在分区剪裁实践上的一点差别

前两天碰到一个问题,在EDB数据库中创建的一张分区表,需要使用分区本地索引和分区剪裁,但查看执行计划发现没能用到分区剪裁的功能。 创建分区表: 创建主表和三个分区的本地索引: 执行以下...

bisal
2015/11/28
0
0
Where语句设置不当导致索引失效

虽然说索引在使用上可能有种种限制,但是还是在数据库设计中被充分利用。因为在大部分情况下索引还是被用来提高数据库性能的一个工具。 虽然说索引在使用上可能有种种限制,但是还是在数据库...

疯狂的艺术家
2011/04/01
0
1
Timestamp 与 Date 变量绑定与Oracle的自动分区

好久没有更新博客了,其实是工作中遇到的很多问题在Google上都能找到答案,也就没有记录下来的必要了。今天主要想聊一下在实际的系统中遇到的Oracle数据库的问题,希望对大家有一点点帮助就好...

Pharosa
2014/07/25
0
0
提高SQL查询效率(SQL优化)

(1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子...

chicharito1429
04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C 语言 二级指针的使用

#include <stdio.h>#include <stdlib.h>typedef struct node Node;struct node {int data;struct node* next;struct node* prev;};Node head;Node* insert(Node......

小张525
32分钟前
2
0
【大数据技术】——Hadoop(1)

什么是大数据 基本概念 《数据处理》 在互联网技术发展到现今阶段,大量日常、工作等事务产生的数据都已经信息化,人类产生的数据量相比以前有了爆炸式的增长,以前的传统的数据处理技术已经...

须臾之余
46分钟前
6
0
比特币从地址逆向计算私钥

区块链 区块链简介 说到比特币,就不得不提区块链。那什么是区块链呢? 区块链本质是一个数据集,只不过数据的组织采用了比较特殊的方式,就是把数据拆分为一块一块的小数据集。 为什么要进行...

trayvon
今天
1
0
TypeScript……真香

写前端或者用 node 写命令行小工具一直采用的 es6 的语法,对于 TypeScript 则是秉持敬而远之的态度,毕竟团队中多推广一门语言所需要花费的精力都是让人望而却步的。所以对于 JavaScript 的...

郁也风
今天
3
0
shell基本案例

1、自定义rm linux系统的rm命令太危险,一不小心就会删除掉系统文件。 写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时,都要做一个备份,然后再删除。下面分两种情况,做...

寰宇01
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部