Oracle特性总结
最近开发项目使用了oracle,根据总体架构一开始选择使用mybatis,发现核心模块用mybatis效率不够,切换到jdbc实现,效率大增。oracle可是个庞然大物,特性多多,丝毫不能马虎,否则很多雷等着去踩。现在产品试运行阶段,回头总结一下踩过的雷,以后有新的发现会持续更新。
1、关于rownum关键字
oracle返回的某条记录的rownum并不是不变的,不要依赖于rownum,非要依赖rownum,注意添加order by分支确定rownum确保不同分页的数据不会重复。项目一启动就制订了约束:不能在项目中应用group by关键字。项目中一次需要汇总统计的输入表达到几百万的数据量级,汇总出来输出最多几万条记录,因此采用分页查询,对分页数据开启多个线程并行执行计算,做完汇总统计再删除多有输入数据,一开始分页查询只用了rownum分页,偶然性的发生汇总出来的数据比输入数据大的情况,接着定位到了是某些记录重复进行汇总统计导致。查了oracle的官方文档,文档描述rownum是在查询返回来的时候决定值,但不是每次查询相同记录都是相同的rownum,可能同一条记录第一次查询,rownum在1-1000之间,下次查询在1001-2000之间。解决方案:在查询语句中加入order by id,其中id是唯一的,重复统计问题得到解决。
2、关于热块竞争问题
一张四五百万级别的输入表input1关联查找另一张一千万级别的输入表input2,关联查询使用了索引,执行计划显示查询确实走了索引。一开始从input1获取n条记录,对n分成k份,开启k个线程对k份数据并发处理,线程内部一进来就执行关联查询,通过日志得知,查询时而执行的很慢,dba协调定位,发现并发查询的多个线程之间有相同数据分布在一个块中,导致资源等待。解决方案:在关联查询的地方做同步块处理,即应用关键字synchronized将关联查询包起来。
3、关于共享内存超出限制问题
利用mybatis实现跑批插入,insert into tb_xxx select xx... from (select ... from dual union all select ... from dual),子查询中union all了1000条记录,在开发库和测试库上执行这条语句正常执行,在生产库中执行了一段时间后,开始抛出共享内存不足异常信息,原来dba对开发库和测试库没有设置共享内存限制,生产库设置了共享内存限制。解决方案:把1000改成了100,暂时问题解决了。
上一篇: 日本AI已写出完整小说
下一篇: VC眼中的传感器和人工智能投资机会在哪里