最近开发项目使用了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. tp3.2开启允许跨域

    在入口文件<?PHP下加上 header('Access-Control-Allow-Origin:*');header("Access-Control-Allow-Headers: ...

  2. canvas画布基础知识

    <canvas> </canvas>标签用于绘制图像(通过脚本,通常是 JavaScript). <canvas> 元素本身并没有绘制能力(它仅仅是图形的容器) - ...

  3. 老生常谈:++a与a--区别

    a++的作用是先对a进行操作再++:a--则相反. 如: int a = 1;int b = a++; //此时先运算b=a,再a++,故b=1,a=2int c = --a; //此时先--a,再运 ...

  4. 转:hive面试题

    有一张很大的表:TRLOG该表大概有2T左右TRLOG:CREATE TABLE TRLOG(PLATFORM string,USER_ID int,CLICK_TIME string,CLICK_U ...

  5. 用navicat工具创建MySQL存储过程

    使用Navicat for MySQL工具创建存储过程步骤: 1. 新建函数(选择函数标签 -> 点击新建函数): 2.输入函数的参数个数.参数名.参数类型等: 3.编写存储过程:  代码如下: ...

  6. python读写不同编码txt文件

        以后整理规范 import os import codecs filenames=os.listdir(os.getcwd()) out=file("name.txt",& ...

  7. cnpm install 之后 Angular2 Build --prod 报错

    95% emittingUnhandled rejection Error: ENOENT: no such file or directory, open 'E:\git_0.28\adminTem ...

  8. Maven学习总结(一)——pom.xml文件配置详解

    <build>标签:<plugins>给出构建过程中所用到的插件 <plugins> <plugin> <groupId>org.apach ...

  9. 移动端 html基值(转载)

    (function () { document.addEventListener('DOMContentLoaded', function () { var html = document.docum ...

  10. 使用ant进行邮件发送,ant发送已存在的html文件

    Jenkins上使用发送邮件功能一直有问题,放弃Jenkins配置,使用ant的进行发送邮件,参考文档可以: https://www.jianshu.com/p/04cfce59890a 我这里是要发 ...