l  日志表应该以时间做分区,方便清理

一般应用都会有一些表用来记录用户操作日志,数据变更记录,交易流水等日志型的库表。这些表最好按时间字段做分区,这样在迁移或者清理历史记录时会比较方便,借助oracle的分区交换清理特性,效率比delete高很多。

l  频繁访问的sequece应该增加cache

Oracle在创建序列可以指定cache参数,如果打开这个参数,Oracle就可以预先生成一些sequece,这样应用获取sequece相互争用数据块的概率就会减少,加快获取sequece速度。

l  队列表也应该做分区,减少出现高水位问题

有时我们会使用数据库表存放待处理的信息,处理完后把记录删除,像是消息队列一样。这种我们称之为队列表。这种表经常会出现高水位的问题,即某一瞬间突然涌入了很多数据,等系统把表里面记录处理完,删除后整个表访问速度还是很慢(因为高水位被上移后没恢复)。这时如果库表有分区,则不容易出现这种问题。

l  减少外键使用

在设计库表时我们一般要使用外键以辅助表示不同库表数据的关联,但在实际部署时最好不要把外键加上。一个原因是外键会影响数据插入删除效率,更重要的原因是加了外键的库表在数据清理,修复时会带来许多麻烦。

l  减少存储过程

有些程序员喜欢使用存储过程封装业务逻辑,虽然这样处理数据速度快,但把压力都留给了数据库服务器。而数据库服务器资源往往是比较有限的,而且比较难扩展。而应用服务器资源相对会丰富一些,也好扩展。所以建议尽量少使用存储过程,即使用也不要放太多业务逻辑。

l  使用绑定变量

尽可能使用绑定变量代替拼sql,这样一是减少sql注入风险,另外一个是让数据库可以复用执行计划(sql文本相同的才有可能复用),减少数据库生成执行计划的消耗。

l  使用并行

Oracle提供并行技术,可以把一个sql涉及的数据集拆分成多份,交由不同进程处理,以加快数据处理速度。对于OLAP系统,可以考虑使用此技巧提高sql运行速度。

l  使用hint避免数据量变化过大的表

有时候我们的应用会出现一些数据变化比较大的表,有时表里面只有几十条数据,有时可能有几万,几十万条。对于这种表的访问最好使用hint强制数据库在任何情况都使用索引访问,因为在数据量小时数据库生成的执行计划可能是使用全表扫描,到后面数据发生变化时由于sql没有变,执行计划也没变,这时使用全表扫描效率就会很低。

l  使用tt 共享内存等

当一个会话需要访问一个数据块,而这个数据块正在被另一个用户从磁盘读取到内存中或者这个数据块正在被另一个会话修改时,当前的会话就需要等待,就会产生一个buffer busy waits等待,也伴随着Latch争用。如果太多的会话去访问相同的数据块导致长时间的buffer busy waits等待,通常表现形式为CPU使用率很高,但吞吐量很低。造成热快的原因可能是数据库设置导致或者重复执行的SQL 频繁访问一些相同的数据块导致。

l  两个大表关联查询尽量走hash join

虽然oracle提供了很多种表关联算法,但是经过实验,对两个数据量大的表连接还是使用hash连接效率最高。

l  尽量少用业务要素作为主键

不使用业务要素作为主键,可以为系统提供很多便利性。一是避免需求变更,原来。二是

l  合理使用纵表和横表设计

所谓横表就是指把一个实体的所有特性存储在一行记录,形成(ID,属性1,属性2,。。。,属性N)的库表。

而纵表则是把实体属性分开多条记录存储,设计成(ID,属性名称,属性值)这样的库表。

下面是一个横表和纵表的例子:

使用横表好处:

1 比较直观,查询比较方便

2 属性值可以根据属性内容设计,例如年龄用number类型存储,职业用varchar2存储

使用纵表好处:

1 避免单表字段不停扩展,oracle是行存储数据库,记录字段越多,记录扫描时消耗的IO就会更多

2 增加属性比较方便

建议:对于频繁使用的属性放横表,对于不频繁使用的属性(例如住址),或者只有少部分记录有的属性(例如博客)放纵表。

l  频繁使用的小表可以考虑设置cache参数

设置了cache后,oracle会尽量让这个表的数据保持在内存,提高访问速度。我碰到过把操作员和菜单信息表加了cache参数,大幅提高登录速度的情况。

l  物化视图

普通视图只是用于简化复杂查询,对于效率提升不大。Oracle提供了一种叫物化视图的特殊对象,可以把视图查询的结果集存起来,并且支持在基础数据变化时自动刷新。不过物化视图bug多,使用需要谨慎。

l  使用rac集群的数据库,最好分业务使用不同优先节点

由于oracle访问数据块时要求先把数据装载到内存,如果有某个数据块频繁被不同实例节点访问,会导致rac集群频繁地把数据从一个节点机器传输到另一个节点,这样会很消耗时间。所以建议不同业务优先访问不同rac节点,这样可以减少数据争抢的概率。

l  善用函数索引解决状态字段查询,少用位图索引

使用。位图索引容易造成数据块争用,建议在OLTP系统少用。

l  悲观锁和乐观锁

悲观锁思想认为,数据被并发修改的几率比较大,需要在修改之前借助于数据库锁机制,先对数据进行加锁。乐观锁思想认为,数据一般是不会造成冲突的。所以在一般先将数据查出来但不加锁,在修改回数据库时检查数据有没有发生过变化,如果有则认为更新失败。业务场景允许失败重试的情况,建议多考虑使用悲观锁,减少锁资源对数据库的消耗。

l  一致读

Oracle的数据块被修改之前会把数据块备份到undo表空间,这样可以保证sql查询过程中,数据被修改不会影响查询结果。而且还可以使用“闪回查询”的技术,指定查询库表某个时间点的数据。

l  使用with as改写复杂的关联查询

这样好处一是简化sql逻辑,二是有必要时还可以使用hint:materialize先把with as的内容实体化,减少重复查询。

l  索引要合理(基数过小的字段不适合建索引)

有些程序员在性别列上面都建了索引,以为查询时至少可以省一半时间,其实是错的。因为对于这种选择性不高的查询,先使用索引查询再回表查会导致很多随机读写,速度反而不如直接全表扫描快。

l  大量数据迁移时加快入库速度的方法:

commit nowait

append

alter table nologging

删除索引

使用交换分区

l  最好对数据库api进行封装,以便在日志里面输出使用的sql

系统做复杂后,新手想完全了解系统业务很困难。如果可以设置在日志里面输出访问数据库使用的sql,可以更方便我们进行系统运维。

更多数据库开发经验见:

https://www.cnblogs.com/kingstarer/p/9613626.html 《oracle数据库应用性能优化经验(培训讲义)》

https://www.cnblogs.com/kingstarer/p/11968247.html 《Oracle Proc编程性能优化经验》

oracle数据库应用开发经验的更多相关文章

  1. <<< sqlserver、Mysql、Oracle数据库优缺点

    sqlserver 优点: 易用性.适合分布式组织的可伸缩性.用于决策支持的数据仓库功能.与许多其他服务器软件紧密关联的集成性.良好的性价比等:   为数据管理与分析带来了灵活性,允许单位在快速变化的 ...

  2. oracle数据库应用性能优化经验(培训讲义)

    这是我给公司同事做的内部培训ppt的讲义,给大家分享一下.这是培训大纲,ppt在找地方上传,等找到了会把链接发在这里 . 暂时放在csdn上,赚点下载积分:https://download.csdn. ...

  3. Oracle数据库的特点与工作原理

    Oracle数据库的特点 1.开放性: Oracle能在所有主流平台上运行(包括Windows),完全支持所有的工业标准,采用完全开放策略,可以使客户选择最适合的解决方案,对开发商全力支持. 2.可伸 ...

  4. 使用Zabbix监控Oracle数据库

    Orabbix介绍 监控Oracle数据库我们需要安装第三方提供的Zabbix插件,我们先测试比较有名的Orabbix,http://www.smartmarmot.com/product/orabb ...

  5. Oracle 数据库知识汇总篇

    Oracle 数据库知识汇总篇(更新中..) 1.安装部署篇 2.管理维护篇 3.数据迁移篇 4.故障处理篇 5.性能调优篇 6.SQL PL/SQL篇 7.考试认证篇 8.原理体系篇 9.架构设计篇 ...

  6. Oracle数据库该如何着手优化一个SQL

    这是个终极问题,因为优化本身的复杂性实在是难以总结的,很多时候优化的方法并不是用到了什么高深莫测的技术,而只是一个思想意识层面的差异,而这些都很可能连带导致性能表现上的巨大差异. 所以有时候我们应该先 ...

  7. Oracle 数据库语句大全

    Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...

  8. Oracle数据库升级(10.2.0.4->11.2.0.4)

    环境: RHEL5.4 + Oracle 10.2.0.4 目的: 在本机将数据库升级到11.2.0.4 之前总结的Oracle数据库异机升级:http://www.cnblogs.com/jyzha ...

  9. 混合框架中Oracle数据库的还原处理操作

    在较早期的随笔<Oracle如何实现创建数据库.备份数据库及数据导出导入的一条龙操作>粗略介绍了Oracle数据库的备份还原操作,本文想从开发框架的基础上介绍Oracle数据库的脚本或者还 ...

随机推荐

  1. React使用antd按需引入报错

    引言 按照antd官网配置按需引入,还是出现一系列的报错: 原因 在网上搜了一下,大部分说是react-scripts以及react-app-rewired版本不兼容的问题,我果断把下载低版本 npm ...

  2. 文件系统(02):基于SpringBoot框架,管理Xml和CSV文件类型

    本文源码:GitHub·点这里 || GitEE·点这里 一.文档类型简介 1.XML文档 XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言.标记指计算机所能理解的信息符号,通过 ...

  3. 计蒜客A1998 Ka Chang (分块+dfs序+树状数组)

    题意 给你一个\(1e5\)的有点权的树,有\(1e5\)个操作: 1.给第\(x\)层的点加上\(y\) 2.求以\(x\)为根的子树的点权和 思路 首先处理出层数为x的所有点 操作2一般都是用df ...

  4. Github搜索技巧-如何使用github找到自己感兴趣的项目(转载)

    Github现在不仅仅作为一个版本控制工具,更是一个开源的仓库,里面不但有优秀的开源代码,电子书,还有一些五花八门的项目,有些国家的法律也放在上面,作为程序员如何找到自己感兴趣的项目就非常重要了! 欢 ...

  5. postman之设置关联

    接口关联(上一个接口的返回参数作为下一个接口的入参使用): 一:在第一个接口的test点击Response body:JSON value check和set an environment varia ...

  6. CentOS使用Postfix发送邮件

    1)配置hosts映射 [root@mail ~]# ifconfig ens33 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mt ...

  7. javascript 防止多次提交或执行(在规定时间段内只允许执行一次) 默认 3000ms

    "use strict" class Func{ constructor(){} isRun(id, time){//防止多次提交或执行(在规定时间段内只允许执行一次) 默认 30 ...

  8. Django (二) 常用字段及 ORM

    MVC介绍 Django生命周期 many-to-many One-to-many Django常用字段 CharFiled 需要有max_length unique=True(代表不能重名) Ema ...

  9. 搭建fastdfs文件服务器

    一.安装FastDFS环境 1.跟踪服务器(Tracker Server) tracker1:192.168.2.134 tracker2:192.168.2.135 2.存储服务器(Storage ...

  10. java 循环变量

    方法:是一段完成特定功能代码的片段. 格式: [修饰符1 修饰符2 ......]返回值类型 方法名(形式参数列表){ java语句;....... } 形式参数:在方法被调用时用于接收外界输入的数据 ...