今天生产环境上碰到个奇怪问题,在oracle数据库一个根据时间范围的查询语句居然执行了二十多分钟。一开始打印了执行sql日志之后就毫无反应了,任何错误都没有。把进程反复重启几次也一样。直到二十分钟后就出现了数据业务处理日志。表的数据量是千万级别,但是时间字段也加了索引的,不至于这么慢吧。查询的时间范围区间也就一分钟。

实在想不出原因在哪里,就写个简单的查询语句试试:

select t.* from IMS_NTF_REMIND_HIS_201711 t where t.SO_DATE>(sysdate-1/24/60) AND t.SO_DATE

奇迹发生,这个查询语句瞬间就出结果。马上查代码看查询语句怎么写的。

String sql = "select t.* from " + tableName + " t where " + " t.SO_DATE >=? and t.SO_DATE < ?";

if (logger.isDebugEnabled()) {

logger.debug("执行query的SQL:{}" , sql);

}

conn = ServiceManager.getSession().getConnection(dbAct);

prepare = conn.prepareStatement(sql);

prepare.setTimestamp(1, startTime);

prepare.setTimestamp(2, endTime);

从这个来看貌似也没发现什么问题,两条sql也没有什么区别。看一下数据库SO_DATE字段是date类型。至于为什么使用PreparedStatement.setTimestamp,是因为PreparedStatement.setDate();方法参数java.sql.Date的日期是没有时分秒的,

不符合查询要求。这里想说明一点,oracle数据库字段是date类型的,普通jdbc查询出来的是不带时分秒的,java.util.Date才带时分秒。要有时分秒就要做个转换

HashMap map = new HashMap();

ResultSetMetaData metaData = rs.getMetaData();

int columns = metaData.getColumnCount();

for (int i = 1; i <= columns; i++) {

if ("DATE".equals(metaData.getColumnTypeName(i))) {

map.put(metaData.getColumnName(i), rs.getTimestamp(i));

} else {

map.put(metaData.getColumnName(i), rs.getObject(i));

}

}

rtn.add(map);

言归正传,看到这里估计也猜出来了,oracle字段类型的隐式转换,将date类型转换为timestamp类型。导致索引失效,就会全表扫描,从而查询缓慢。知道问题所在解决就简单了,时间字符串,使用to_date()函数来转换字符串为日期和date做比较。改完之后重新测试查询速度变为了毫秒级别。

总结:

oracle date 和 timestamp类型混用时需要注意索引失效问题。如果oracle数据库字段是date类型,需要时分秒的就用字符串时间格式,使用to_date()函数转换做比较。不需要时分秒的就用java.sql.Date。

oracle mysql查询速度慢_oracle 根据时间范围查询缓慢问题排查解决相关推荐

  1. mysql查找 提速_MySQL加速查询速度的独门武器:查询缓存

    [导读] 与朋友或同事谈到mysql查询缓存功能的时候,个人喜欢把Query Cache比作荔枝,是非常营养的东西,但是一次性吃太多了,就容易导致上火而流鼻血,虽然不是特别恰当的比喻,但是有很多相似的 ...

  2. 提高mysql查询速度_如何提高数据库查询速度

    1.用程序中, 保证在实现功能的基础上,尽量减少对数据库的访问次数: 通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担: 能够分开的操作尽量分开处理,提高每次的响应速度: 在数据窗 ...

  3. mysql oracle查询速度慢_oracle查看执行最慢与查询次数最多的sql语句

    前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致.如果执行频 ...

  4. oracle mssql 实例,oracle,mysql,SqlServer三种数据库的分页查询的实例

    MySql: MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了. LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数, ...

  5. infomixdb mysql_不同数据库oracle mysql SQL Server DB2 infomix sybase分页查询语句

    在不同数据库中的使用的分页查询语句: 当前页:currentpage 页大小:pagesize 1. Oracle数据库 select * from (select A.*,rownum rn fro ...

  6. oracle mysql事物隔离级别_Oracle数据库事物隔离级别

    事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度. 两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题: 1.幻想读:事务T1读取一条指定where条件的语句,返回结果集.此 ...

  7. oracle mysql 数据验证工具_Oracle Orion tool check io(ORACLE Orion 工具查看以及校验IO)

    文档主要来自oracle官方文档performance 8.3章节 Oracle数据库提供了Orion,一种 I/O校准工具.Orion是预测Oracle数据库性能的工具,无需安装Oracle或创建数 ...

  8. oracle mysql 中文排序规则_ORACLE对中文排序性能优化

    Oracle提供了以下类型的排序方式:(1)二进制排序(2)单语言形式排序(3)多语言形式排序 使用二进制排序排序字符数据的一种方法是基于字符的数值定义的字符编码方案.这就是所谓的二进制排序.二进制排 ...

  9. oracle多边形经纬范围筛选_Oracle根据经纬度查询一定范围内的数据

    指定一个经纬度,给定一个范围值(单位:千米),查出在经纬度周围这个范围内的数据. 经度:23.33 纬度:34.66 范围:2000km SA_LONGITUDE为数据表经度字段 SA_LATITUD ...

最新文章

  1. 2022-2028年中国重卡行业投资分析及前景预测报告
  2. 妥~阿里程序员常用的 15 款开发者工具
  3. android ART编译预优化
  4. Linux编译动态链接库
  5. Java敌人跟地图的碰撞_(译)加入敌人和战斗:如果使用cocos2d制作基于tiled地图的游戏:第三部分...
  6. 多边形之间相交求交点的算法_路径规划算法总结
  7. 使用lombok来简化你的Java Bean
  8. 帝国CMS标签 总结2
  9. 换一种态度看程序员(转)
  10. Codejam Qualification Round 2019
  11. 分布式通用爬虫管理平台Crawlab
  12. 九九乘法表新打表(倒三角式)
  13. Win10 UWP 开发教程
  14. 忠告:使用TNT版本PD的不要升级新版本Mac系统
  15. 关于交换机包转发1.488Mpps是如何计算出来?
  16. 3D打印肝模型抢救生命
  17. 『重磅福利』提供WoS数据C1和EM重复字段清洗服务
  18. Azure云平台之游戏
  19. base64 decode java_Java实现Base64编解码
  20. maven项目的pom.xml文件添加依赖

热门文章

  1. .ServletException: Circular view path [index]: would dispatch back to the curren这是springboot
  2. SSM框架(spring+spring mvc+mybatis)+Mysql实现的星星少儿教育系统(功能包含前台:首页少儿早教知识、资讯、英语课程、视频、专家,后台包括文章管理、来源管理、返回首页等)
  3. Linux嵌入式系统简答题复习
  4. Print Spooler 服务自动停止
  5. 产品大牛网站 Axure
  6. vue原生小球抛物线 仿优信二手车
  7. 计算机组装与维修2试卷,《计算机组装与维修》期末试卷(A) (2)
  8. 务实 创业_务实思维:新手与专家
  9. Tomcat配置虚拟目录
  10. 你不知道的USB知识二——USB认证