系统运行的平稳离不开高性能数据库的支持,但是数据库时有问题出现,主要是一些等待事件影响了数据库的运行,例如enq: TX - row lock contention,db file sequential read,latch: cache buffers chains等,后台的一些等待事件,I/O等待事件,SQL解释和内存排序,索引等待事件等。
后台等待事件:
一般为db file sequential read 和control file sequential read,这两者,一般在查询语句使用索引读取索引块进驻内存的时候才发生,因此建议将查询中大部分索引进行修正,采用REVERSE 的方式减少索引块的争用。
log file sync等待事件是指用户进程等待LGWR的写完成通知的。 该等待事件过多,说明了LGWR的写效率低下,照成的原因可能是系统提交过于频繁。我们可以关注下
log file parallel write事件,建议提高LGWR性能或使用批量提交,适当使用NOLOGGING/UNRECOVERABLE等选项。
gc buffer busy的原理,大致是:一个操作使用数据块时,会锁住这个块,另外一个操作就必须等待才能获得这个块的使用权。
索引等待事件:
数据库CPU DB/DB TIME% 使用率偏低,一般从SQL ORDER BY GETS方向优化。
SQL命中率欠缺:
主要是在执行SQL语句的时候,一般都会对语句进行解释,但是有时候解释的语句只占有很小的比列,需要检查应用程序是否都采用了绑定变量的方式执行SQL语句。
优化:
gc buffer busy方面:
建议是做好业务分离,这些方面一般都是集群类的等待事件,简单地说就是每个节点的应用(使用到的表)应该尽可能独立,这样是为了减少节点间的数据交互,提高数据库的性能。尤其对于频繁执行的语句,对数据库性能影响比较大,应部署在一个节点上。
log file sync方面:
建议可以通过批量提交的方式来减少log file sync等待事件对数据库性能的影响。
另外,可以考虑增加系统内存来提高数据库性能。
SQL优化方面:
可以适当的给某些表的字段添加索引,
可以给某些表添加复合索引。
Alter table table_name add index indexname (column_list)
Alter table table_name add index unique (column_list)
Alter table table_name add index primary key(column_list)