日期:2014-05-16  浏览次数:20448 次

关系型数据库(Oracle)性能优化(二)

调整数据库结构的设计?

? ? 这一部分在开发信息系统之前完成,需要考虑是否使用Oracle数据库的分区功能,对于经常访问的数据库表是否需要建立索引等。 ?


调整数据库SQL语句?

? ? 应用程序的执行最终将归结为数据库中的SQL语句执行,因此SQL语句的执行效率最终决定了Oracle数据库的性能。?Oracle公司推荐使用Oracle语句优化器(Oracle?Optimizer)和行锁管理器(Row-Level?Manager)来调整优化SQL语句。 ??

?

二、调整应用程序的SQL

? ??1. 不要进行全表扫描(Full Table Scan):全表扫描导致大量的I/O

? 2. 尽量建好和使用好索引:

? ? ?建索引也是有讲究的,在建索引时,也不是索引越多越好,当一个表的索引达到4个以上时,ORACLE的性能可能还是改善不了,因为OLTP系统每表超过5个索引即会降低性能,而且在一个sql 中, Oracle 从不能使用超过 5个索引;当我们用到GROUP BYORDER BY,ORACLE就会自动对数据进行排序,ORACLEINIT.ORA中决定了sort_area_size区的大小,当排序不能在我们给定的排序区完成时,ORACLE就会在磁盘中进行排序,也就是我们讲的临时表空间中排序, 过多的磁盘排序将会令 free buffer waits 的值变高,而这个区间并不只是用于排序的,对于开发人员我提出如下忠告:

  1)select,update,delete 语句中的子查询应当有规律地查找少于20%的表行.如果一个语句查找的行数超过总行数的20%,它将不能通过使用索引获得性能上的提高.

  2)、索引可能产生碎片,因为记录从表中删除时,相应也从表的索引中删除.表释放的空间可以再用,索引释放的空间却不能再用.频繁进行删除操作的被索引的表,应当阶段性地重建索引,以避免在索引中造成空间碎片,影响性能.在许可的条件下,也可以阶段性地truncate,truncate命令删除表中所有记录,也删除索引碎片.