Oracle数据库应用系统的调优,实质就是降低CPU负载、改善I/O性能(磁盘,网络),提高内存使用率。
表空间优化
SYSTEM表空间用于存放ORACLE系统的有关信息,要保证其有足够的空余量。一般的用户建立的对象(object)不应放在SYSTEM表空间中。
应将用户表空间及数据文件一次性设置成合适的大小,避免数据文件自动增长,造成数据段块/段的不连续,影响系统性能。
定期检查数据库表空间的使用情况,进行碎片整理,防止表空间碎块过多,影响系统性能。
通过查询视图dba_extents可获取表空间详细的使用情况。
合并表空间碎片
alter tablespace tablespacename coalesce;
回收数据表段的空闲空间
alter table tablename deallocate unused;
临时表空间主要用于查询操作中的distinct 、union 、order by以及create index操作及存储临时表数据等。Oracle缺省表空间为Temp,其大小为1MB,比较小。系统比较大的话,需要增加Temp表空间到合适的大小,一般为300M-500M左右。
创建用户时应为其选择专用的临时表空间。
应该为大的应用系统建立专门的大的临时表空间,用于进行系统的月报、季报、年报统计存储临时表数据等。
日志文件
将数据文件和日志文件存储于不同磁盘上
数据文件的写入是通过DBWR后台进程实现,日志文件的写入是通过LGWR后台进程实现,由于日志文件是连续的写入,因此无并发处理现象。而数据文件的写入相对是随机的,为避免在同一时间内DBWR和LGWR的冲突,应将日志文件和数据文件放在不同的硬盘上。
优化操作系统环境
配置操作系统启用异步I/O
将Oracle的SGA(System Global Area系统全局区)锁定在物理内存中。
几乎所有的操作系统都支持虚拟内存,所以即使我们使用的内存小于物理内存,也不能避免操作系统将SGA交换到虚拟内存(SWAP),通过相应配置将Oracle SGA锁定在物理内存避免被交换到虚拟内存中,可以减少页面的换入和换出,从而提高性能。
控制内存交换操作(Paging)
大量的内存交换操作会极大地影响系统的性能,尤其是在当数据库文件创建在文件系统上时影响更大。
优化数据库内存
优化SGA(System Global Area )
对于Oracle内存的调整设置,要根据实际情况酌情考虑,基本的原则是:
数据缓冲区(data buffer):用于存放从数据文件读入的数据块,可以尽可能的大;
共享池(shared_pool_size):用于保存数据字典及当前执行的SQL语句和存储过程,要适度;
日志缓冲区(log_buffer):用于缓存用户更新的数据,不需太大。
shared_pool_size:要大小要适度,通常设为500M左右,不应超过700M。
log_buffer :通常设为512K到1M。
优化PGA (Program Global Area )
sort_area_size:默认64K,通常设置为128K到512K
hash_area_size:不做配置,是根据2*sort_area_size计算得到
这两个参数在非MTS下都是属于PGA(Program Global Area),不属于SGA。它是为每个session单独分配的,所以服务器上内存开销情况通常要求:OS内存+SGA+session* (sort_area_size+hash_area_size+2M)<总物理RAM。
SQL优化
创建表的时候。应尽量建立主键;大数据表删除,用truncate table代替delete。
合理使用索引,在OLTP应用中一张表的索引不要太多。数据重复量大的列可以采用位图索引;
组合索引的列顺序尽量与查询条件列顺序保持一致;
对于数据操作频繁的表,索引需要定期重建,以减少失效的索引和碎片。
查询尽量用确定的列名,少用*号。
select count(key)from tab where key> 0性能优于select count(*)from tab
尽量少嵌套子查询,这种查询会消耗大量的CPU资源。
对于有比较多or运算的查询,建议分成多个查询,用union all联结起来。
多表查询的查询语句中,选择最有效率的表名顺序。
Oracle解析器对表解析从右到左,所以记录少的表放在右边。
尽量多用commit语句提交事务,可以及时释放资源、解锁、释放日志空间、减少管理花费。
在频繁的、性能要求比较高的数据操作中,尽量避免远程访问,如数据库链等,访问频繁的表可以常驻内存:alter table...cache。
汇总表可以使用物化视图提前计算,提高效率。物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。