oracle数据库应用开发经验

 

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

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

 

 

l  频繁访问的sequece应该增长cache算法

Oracle在建立序列能够指定cache参数,若是打开这个参数,Oracle就能够预先生成一些sequece,这样应用获取sequece相互争用数据块的几率就会减小,加快获取sequece速度。sql

 

 

l  队列表也应该作分区,减小出现高水位问题数据库

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

 

l  减小外键使用api

在设计库表时咱们通常要使用外键以辅助表示不一样库表数据的关联,但在实际部署时最好不要把外键加上。一个缘由是外键会影响数据插入删除效率,更重要的缘由是加了外键的库表在数据清理,修复时会带来许多麻烦。性能优化

 

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,能够更方便咱们进行系统运维。

 

 

更多数据库开发经验见:

http://www.javashuo.com/article/p-bvcipkfa-gn.html 《oracle数据库应用性能优化经验(培训讲义)》

http://www.javashuo.com/article/p-wxiusnmm-hc.html 《Oracle Proc编程性能优化经验》

相关文章
相关标签/搜索