構建一個企業級的應用系統,往往數據庫成為最終的一個負載瓶頸,在我們優化完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語句,對比數值的差異。