ORACLE數據庫的優化
CPU參數的調整
CPU是服務器的一項重要資,服務器良好的工作狀態是在工作高峰時CPU的使用在90%以上。如果空閑時間CPU使用率就在90%以上,說明服務器缺乏CPU資源,如果工作高峰時CPU使用率仍然恨低,說明服務器CPU資源還比較富余。
使用操作相同命令可以看到CPU的使用情況,以般UNIX操作系統的服務器,可以使用sar–u命令查看CPU的使用率,NT操作系統的服務器,可以使用NT的性能管理器來查看CPU的使用率。
數據庫管理員可以通過查看v$sysstat(select*fromv$sysstat wherenamelike'CPU%')數據字典中“CPUused by this session”統計項得知ORACLE數據庫使用的CPU時間,查看“OS Userlevel CPU time“統計項得知操作系統用戶態的CPU時間,查看“OS Systemcall CPU time“統計項得知操作系統系統態下的CPU時間,操作系統總的CPU時間就是用戶態和系統態時間之和,如果ORACLE數據庫使用的CPU時間占操作系統總的CPU時間90%以上,說明服務器CPU基本上被ORACLE數據庫使用著,這是合理,反之,說明服務器CPU被其它程序占用過多,ORACLE數據庫無法得到更多的CPU時間。
數據庫管理員還可以通過查看v$sesstat數據字典來獲得當前連接ORACLE數據庫各個會話占用的CPU時間,從而得知什么會話耗用服務器CPU比較多。(select*fromv$sysstat orderbyvaluedesc)
出現CPU資源不足的情況是很多的:SQL語句的重解析、低效率的SQL語句、鎖沖突都會引起CPU資源不足。
1、數據庫管理員可以執行下述語句來查看SQL語句的解析情況:
SELECT * FROM V$SYSSTAT
WHERE NAME IN
('parse time cpu', 'parse time elapsed', 'parse count (hard)');
這里parse time cpu是系統服務時間,parse timeelapsed是響應時間,用戶等待時間
waite time = parse time elapsed – parse time cpu
由此可以得到用戶SQL語句平均解析等待時間=waite time / parse count,這個平均等待時間應該接近于0,如果平均解析等待時間過長,數據庫管理員可以通過下述語句
SELECTSQL_TEXT, PARSE_CALLS, EXECUTIONS FROM V$SQLAREA
ORDER BY PARSE_CALLS;
來發現是什么SQL語句解析效率比較低。程序員可以優化這些語句,或者增加ORACLE參數SESSION_CACHED_CURSORS的值。
2、數據庫管理員還可以通過下述語句:
SELECT BUFFER_GETS, EXECUTIONS, SQL_TEXT FROMV$SQLAREA;
查看低效率的SQL語句,優化這些語句也有助于提高CPU的利用率。
3、數據庫管理員可以通過v$system_event(select*fromv$system_event where event like'_atch%';)數據字典中的”latchfree“統計項查看ORACLE數據庫的沖突情況,如果沒有沖突的話,latch free查詢出來沒有結果。如果沖突太大的話,數據庫管理員可以降低spin_count參數值,來消除高的CPU使用率。
內存參數的調整
內存參數的調整主要是指ORACLE數據庫的系統全局區(SGA)的調整。SGA主要由三部分構成:共享池、數據緩沖區、日志緩沖區。
1、 共享池由兩部分構成:共享SQL區和數據字典緩沖區,共享SQL區是存放用戶SQL命令的區域,數據字典緩沖區存放數據庫運行的動態信息。數據庫管理員通過執行下述語句:
select (sum(pins -reloads)) / sum(pins) "Lib Cache" from v$librarycache;
來查看共享SQL區的使用率。這個使用率應在90%以上,否則需要增加共享池的大小。數據庫管理員還可以執行下述語句:
select (sum(gets - getmisses - usage - fixed))/ sum(gets) "Row Cache" from v$rowcache;
查看數據字典緩沖區的使用率,這個使用率也應該在90%以上,否則需要增加共享池的大小。
2、 數據緩沖區.數據庫管理員可以通過下述語句:
SELECT name, value FROM v$sysstat WHERE name IN ('db block gets', 'consistentgets','physical reads');
來查看數據庫數據緩沖區的使用情況。查詢出來的結果可以計算出來數據緩沖區的使用命中率=1 - ( physical reads / (db block gets + consistent gets))。
這個命中率應該在90%以上,否則需要增加數據緩沖區的大小。
3、 日志緩沖區.數據庫管理員可以通過執行下述語句:
select name,value from v$sysstat where name in('redo entries','redo log space requests');查看日志緩沖區的使用情況。查詢出的結果可以計算出日志緩沖區的申請失敗率:
申請失敗率=requests/entries,申請失敗率應該接近于0,否則說明日志緩沖區開設太小,需要增加ORACLE數據庫的日志緩沖區。