最近开发项目使用了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,暂时问题解决了。

Oracle特性总结的更多相关文章

  1. Oracle 12c In Memory Option初探

    前情提要: Oracle OpenWorld 2013中Larry Ellison爆料的Oracle新特性:Oracle In Memory Database Option 1. 这个新特性将随着12 ...

  2. 使用Oracle ODP.NET 11g的.NET程序发布方法

    使用Oracle ODP.NET 11g的.NET程序发布方法 内容摘要:ODP.NET 11g是Oracle发布的供.NET程序访问Oracle数据库的ADO.NET组件,比微软自带的Oracle组 ...

  3. ORACLE数据库存储结构

    一.数据块 Oracle对数据库数据文件中的存储空间进行管理的单位是数据块.数据块是数据库中最小的(逻辑)数据单位,是最小的I/O单位.与数据块对应的,所有数据在操作系统级的最小物理存储单位是字节.每 ...

  4. Oracle 11g AMM与ASMM切换

    现在的Oracle正在往智能化方向发展.如果我们现在找一些8i/9i时代的Oracle书籍,怎么样配置合适的数据库各内存池大小是非常重要的话题.但是进入10g之后,自动内存池调节成为一个重要Oracl ...

  5. [oracle]Oracle数据库安全管理

    目录 +  1.数据库安全控制策略概述 +  2.用户管理 +  3.资源限制与口令管理 +  4.权限管理 +  5.角色管理 +  6.审计 1.数据库安全控制策略概述 安全性是评估一个数据库的重 ...

  6. [转帖]Oracle 12cR2使用经验

    大规模升级来临,谈谈Oracle 12cR2使用经验 随着2019年2月13日,Oracle 19c (Oracle 12.2.0.3) for Exadata 版本发布,Oracle 12cR2体系 ...

  7. Oracle SQL Developer,Oracle 开发工具之toad、SQL Developer、PL/SQL Developer等比较

    参考: oracle 的几个开发工具比较 因Oracle几乎是中大型商业企业数据的首选,所以比较一下常用与Oracle的工具. Oracle SQL Developer 免费,一般开发使用足矣,常用. ...

  8. Oracle常用常考集合

    登陆远程服务器 sqlplus scott/tiger@192.168.2.1[:port]/sid [as sysdba] 简单查询 select  table_name from user_tab ...

  9. Oracle是如何工作的?实例是如何响应用户请求?一条SQL的执行过程~

    Oracle 是如何工作的? Select id,name from t order by id ; – SQL 解析(查看语法是否错误,如果没有错误,分析语意,执行此语句的权限) – 执行计划(OR ...

随机推荐

  1. apply()方法和call()方法

    obj.func.call(obj1)       //是将obj1看做obj,调用func方法,将第一个参数看做函数调用的对象,可以看做,将obj的方法给obj1使用 ECMAScript规范给所有 ...

  2. 项目经验:GIS<MapWinGIS>建模第六天

    针对管网的暴管发生情况的,关阀分析,能够更快,更及时给施工作人员找到最近需要关停的阀门点,及受影响的管网段,如在这个区域内,还能找到受影响需要停水的用户

  3. Tesseract-OCR-05-主要API功能介绍

    Tesseract-05-主要API功能介绍 tesseract本身代码是由c/c++混编而成的,其中有用的简单的接口函数几乎都是在baseapi.h中 从其处理过程中,不难得出: 它还需要有一个im ...

  4. Hush Framework框架配置(续) 转自《Android和PHP最佳实践》官方站

    图书资源下载 Xampp 开发环境下载:http://pan.baidu.com/share/link?shareid=531771&uk=773037279 微博实例完整源码包下载:http ...

  5. hook的函数传入类

    简单记录 比如要hook一个app包中一个类的private void c(dmp dmp1),其中dmp是个类,这种的处理的方式如下: 用cydiasubstrate hook框架 1.先通过hoo ...

  6. maven学习(七)后续扩展、资料

    写这几篇博客的来源是 "maven实战 + 网上的博客 + 平时使用的心得 ".记录的都是比较常用的东西,也有一些只做了大概了解.或者干脆直接略过,在这里做一下总结,如果有需要在进 ...

  7. spring----面试题

    1.什么是Spring beans? Spring beans 是那些形成Spring应用的主干的java对象.它们被Spring IOC容器初始化,装配,和管理.这些beans通过容器中配置的元数据 ...

  8. 四、CentOS 安装mariadb——Linux学习笔记

    A)安装及配置 下载mariadb: yum -y install mariadb-server mariadb 开启mariadb服务: systemctl start mariadb.servic ...

  9. Elasticsearch 架构原理

    为什么要学习架构? Elasticsearch的一些架构设计,对我们做性能调优.故障处理,具有非常重要的影响.下面将从Elasticsearch的准实时索引的实现.自动发现.rounting和repl ...

  10. linux oom-killer

    本人从事UTM的开发工作,最近遇到out of memory killer.这里整理一下资料. 简述 当系统内存不足时,系统会触发 oom-killer.oom-killer的机制就是选择杀掉最适合的 ...