构建一个企业级的应用系统,往往数据库成为最终的一个负载瓶颈,在我们优化完sql语句、优化完应用程序之后,数据库的调优必不可少,下面就基于sql查询的命中率的oracle调优做一个简单的说明。
1.先检验数据库的查询命中率,请执行下面的2组sql语句,并且分别记录修改之前的数值。
第一组sql语句如下:
select 100- (j.value-( a.value+b.value )) /(u.value+v.value-a.value-b.value)*100 as 命中率 from
(select value from v$sysstat where name ='physical reads direct' ) a,
(select value from v$sysstat where name ='physical reads direct (lob)' ) b,
(select value from v$sysstat where name ='physical reads') j,
(select value from v$sysstat where name ='consistent gets') u,
(select value from v$sysstat where name = 'db block gets') v ;
第二组sql语句如下:
select sum(gets) "请求存取数",sum(getmisses) "不命中数" , (1-sum(getmisses)/sum(gets) )*100 "命中率"
from v$rowcache;
2.如果第一组sql语句执行的结果是<90%,则说明需要调整oracle数据库的内存(SGA的大小),第二组sql语句作为一个参照。
一般经验:在 1G 的内存的服务器上,我们能分配给SGA的内存大约为400—500M 。若是2G的内存,大约可以分到1G的内存给 SGA,8G 的内存可以分到5G的内存给SGA。
考虑到数据库服务器的机器内存大小为2G, 可以按照以下脚本执行修改:
【注:请用具有dba权限的用户登录“login as sysdba”登录,可以用pl/sql工具】
--修改前备份一下sqfile
create pfile='d:\oracle\ora9init.ora' from spfile;
--修改共享池大小
alter system set shared_pool_size =256M scope=spfile;
--修改缓冲池大小
alter system set db_cache_size=896M scope=spfile;
--大缓冲池
alter system set large_pool_size=100m scope=spfile;
--修改链接进程数
alter system set processes=1500 scope=spfile;
--会话数
alter system set sessions=900 scope=spfile;
--事务数
alter system set transactions=900 scope=spfile;
--打开游标数
alter system set open_cursors =1000 scope=spfile;
3.用pl/sql工具修改了这些参数之后,需要重启oracle服务。当重启之后再查执行开始的2组sql语句,对比数值的差异。