Oracle 內(nèi)存分配和調(diào)優(yōu) 總結(jié)
一直都想總結(jié)一下oracle內(nèi)存調(diào)整方面的知識(shí)士复,最近正好優(yōu)化一個(gè)數(shù)據(jù)庫內(nèi)存參數(shù)暇矫,查找一些資料并且google很多下≌崞椋現(xiàn)在記錄下來我擂,做下備份衬以。
概述:
Oracle 的內(nèi)存可以按照共享和私有的角度分為系統(tǒng)全局區(qū)和進(jìn)程全局區(qū),也就是 SGA和 PGA(process global area or private global area)校摩。對于 SGA 區(qū)域內(nèi)的內(nèi)存來說看峻,是共享的全局的,在 UNIX 上衙吩,必須為 oracle 設(shè)置共享內(nèi)存段(可以是一個(gè)或者多個(gè))互妓,因?yàn)?oracle 在UNIX 上是多進(jìn)程;而在 WINDOWS 上 oracle 是單進(jìn)程(多個(gè)線程)坤塞,所以不用設(shè)置共享內(nèi)存段冯勉。PGA 是屬于進(jìn)程(線程)私有的區(qū)域。在 Oracle 使用共享服務(wù)器模式下(MTS),PGA中的一部分摹芙,也就是 UGA 會(huì)被放入共享內(nèi)存 large_pool_size 中灼狰。
發(fā)張圖Oracle內(nèi)存架構(gòu)組成,按照圖上面的顯示可以一目了然關(guān)鍵的參數(shù)和參數(shù)名稱:
對于 SGA 部分浮禾,我們通過 sqlplus 中查詢可以看到:
SQL> select * from v$sga;
NAME VALUE
-------------------- ----------
Fixed Size 1380840
Variable Size 1241517592
Database Buffers 1325400064
Redo Buffers 9613312
SQL> select * from v$sga;
NAME VALUE
-------------------- ----------
Fixed Size 2188768
Variable Size 2603824182
Database Buffers 2872259379
Redo Buffers 20566016
Fixed Size:
Oracle 的不同平臺(tái)和不同版本下可能不一樣交胚,但對于確定環(huán)境是一個(gè)固定的值,里面存儲(chǔ)了 SGA 各部分組件的信息盈电,可以看作引導(dǎo)建立 SGA 的區(qū)域蝴簇。Variable Size :
包含了 shared_pool_size、java_pool_size挣轨、large_pool_size 等內(nèi)存設(shè)置Database Buffers : 指數(shù)據(jù)緩沖區(qū):
在 8i 中包 含 db_block_buffer*db_block_size军熏、buffer_pool_keep、buffer_pool_recycle 三 部 分內(nèi) 存 卷扮。
在 9i 中 包 含 db_cache_size 荡澎、db_keep_cache_size、db_recycle_cache_size晤锹、db_nk_cache_size摩幔。Redo Buffers :
指日志緩沖區(qū),log_buffer鞭铆。在這里要額外說明一點(diǎn)的是或衡,對于 v$parameter焦影、v$sgastat、v$sga 查詢值可能不一樣封断。v$parameter 里面的值斯辰,是指用戶在初
始化參數(shù)文件里面設(shè)置的值,v$sgastat 是 Oracle 實(shí)際分配的日志緩沖區(qū)大衅绿邸(因?yàn)榫彌_區(qū)的分配值實(shí)際上是離散的彬呻,也不是以 block 為最小單位進(jìn)行分配的),
v$sga 里面查詢的值柄瑰,是在 Oracle 分配了日志緩沖區(qū)后闸氮,為了保護(hù)日志緩沖區(qū),設(shè)置了一些保護(hù)頁教沾,通常我們會(huì)發(fā)現(xiàn)保護(hù)頁大小大約是 11k(不同環(huán)境可能不一樣)蒲跨。
Oracle 內(nèi)存調(diào)優(yōu)辦法
當(dāng)項(xiàng)目的生產(chǎn)環(huán)境出現(xiàn)性能問題,我們?nèi)绾瓮ㄟ^判斷那些參數(shù)需要調(diào)整呢授翻?
檢查ORACLE實(shí)例的Library Cache命中率:
標(biāo)準(zhǔn):一般是大于99%
檢查方式:
SQL> select 1-(sum(reloads)/sum(pins)) "Library cache Hit Ratio" from v$librarycache;
Library cache Hit Ratio
-----------------------
0.995500931581541
處理措施:
如果Library cache Hit Ratio的值低于99%或悲,應(yīng)調(diào)高shared_pool_size的大小。通過sqlplus連接數(shù)據(jù)庫執(zhí)行如下命令藏姐,調(diào)整shared_pool_size的大新÷帷:
SQL>alter system flush shared_pool;
SQL>alter system set shared_pool_size=設(shè)定值 scope=spfile;
檢查ORACLE實(shí)例的Data Buffer(數(shù)據(jù)緩沖區(qū))命中率
標(biāo)準(zhǔn):一般是大于90%
檢查方式:
SQL> select 1 - (phy.value / (cur.value + con.value)) "HIT RATIO"
2 from v$sysstat cur, v$sysstat con, v$sysstat phy
3 where cur.name = 'db block gets'
4 and con.name = 'consistent gets'
5 and phy.name = 'physical reads';
HIT RATIO
----------
0.97678192
處理措施:
如果HIT RATIO的值低于90%,應(yīng)調(diào)高db_cache_size的大小羔杨。通過sqlplus連接數(shù)據(jù)庫執(zhí)行如下命令捌臊,
調(diào)整db_cache_size的大小
SQL>alter system set db_cache_size=設(shè)定值 scope=spfile
檢查ORACLE實(shí)例的Dictionary Cache命中率
標(biāo)準(zhǔn):一般是大于95%
檢查方式:
SQL> select 1 - (sum(getmisses) / sum(gets)) "Data Dictionary Hit Ratio"
2 from v$rowcache;
Data Dictionary Hit Ratio
-------------------------
0.999701677408011
處理措施:
如果Data Dictionary Hit Ratio的值低于95%,應(yīng)調(diào)高shared_pool_size的大小兜材。通過sqlplus連接數(shù)據(jù)庫執(zhí)行如下命令理澎,調(diào)整shared_pool_size的大小:
SQL>alter system flush shared_pool;
SQL>alter system set shared_pool_size=設(shè)定值 scope=spfile;
檢查ORACLE實(shí)例的Log Buffer命中率
標(biāo)準(zhǔn):一般是小于1%
檢查方式:
SQL> select (req.value * 5000) / entries.value "Ratio"
2 from v$sysstat req, v$sysstat entries
3 where req.name = 'redo log space requests'
4 and entries.name = 'redo entries';
Ratio
----------
0.08082257
處理措施:
如果Ratio高于1%曙寡,應(yīng)調(diào)高log_buffer的大小糠爬。通過sqlplus連接數(shù)據(jù)庫執(zhí)行如下命令,調(diào)整log_buffer的大芯偈:
SQL>alter system set log_buffer=設(shè)定值 scope=spfile;
檢查undo_retention
標(biāo)準(zhǔn):undo_retention 的值必須大于max(maxquerylen)的值
檢查方式:
SQL> col undo_retention format a30
SQL> select value "undo_retention" from v$parameter where name='undo_retention';
undo_retention
------------------------------
900
SQL> select max(maxquerylen) From v$undostat Where begin_time>sysdate-(1/4);
MAX(MAXQUERYLEN)
----------------
1253
處理措施:
如果不滿足要求执隧,需要調(diào)高undo_retention 的值。通過sqlplus 連接數(shù)據(jù)庫執(zhí)行如下命
令户侥,調(diào)整undo_retention 的大卸屏稹:
SQL>alter system set undo_retention= 設(shè)定值 scope=spfile;
SQL> alter system set undo_retention=2048 scope=spfile;
System altered
簡單查看ORACLE的連接情況和內(nèi)存使用情況
查看連接Oracle的所有機(jī)器的連接數(shù)
-- 查看連接Oracle的所有機(jī)器的連接數(shù)
SELECT MACHINE,COUNT(*) FROM V$SESSION GROUP BY MACHINE;
SQL> SELECT MACHINE,COUNT(*) FROM V$SESSION GROUP BY MACHINE;
MACHINE COUNT(*)
---------------------------------------------------------------- ----------
WIN-Q9I6NL3EJCU 28
USER-20151208SP\USER-20151208SP 14
WORKGROUP\WIN-Q9I6NL3EJCU 6
WORKGROUP\USER-20151208SP 7
IIS APPPOOL\WIN-Q9I6NL3EJCU 14
查看連接Oracle的所有機(jī)器的連接數(shù)和狀態(tài)
-- 查看連接Oracle的所有機(jī)器的連接數(shù)和狀態(tài)
SELECT MACHINE,STATUS,COUNT(*) FROM V$SESSION GROUP BY MACHINE,STATUS ORDER BY STATUS;
SQL> SELECT MACHINE,STATUS,COUNT(*) FROM V$SESSION GROUP BY MACHINE,STATUS ORDER BY STATUS;
MACHINE STATUS COUNT(*)
---------------------------------------------------------------- -------- ----------
WIN-Q9I6NL3EJCU ACTIVE 26
WORKGROUP\USER-20151208SP ACTIVE 1
WORKGROUP\WIN-Q9I6NL3EJCU ACTIVE 1
IIS APPPOOL\WIN-Q9I6NL3EJCU INACTIVE 13
USER-20151208SP\USER-20151208SP INACTIVE 14
WIN-Q9I6NL3EJCU INACTIVE 4
WORKGROUP\USER-20151208SP INACTIVE 6
WORKGROUP\WIN-Q9I6NL3EJCU INACTIVE 5
8 rows selected
Oracle的PGA、SGA和process count
-- Oracle的PGA蕊唐、SGA和process count
SELECT 'SGA' AS NAME,ROUND(SUM(VALUE)/1024/1024,2)||'M' AS "SIZE(M)" FROM V$SGA
UNION
SELECT 'PGA' AS NAME,ROUND(VALUE/1024/1024,2)||'M' AS "SIZE(M)" FROM V$PGASTAT WHERE NAME='TOTAL PGA ALLOCATED'
UNION
SELECT 'TOTAL' AS NAME,((SELECT ROUND(SUM(VALUE)/1024/1024,2) FROM V$SGA)+(SELECT ROUND(VALUE/1024/1024,2) FROM V$PGASTAT WHERE NAME='TOTAL PGA ALLOCATED'))||'M' AS "SIZE(M)" FROM DUAL
UNION
SELECT NAME,TO_CHAR(VALUE) FROM V$PGASTAT WHERE NAME='PROCESS COUNT';
SQL> SELECT 'SGA' AS NAME,ROUND(SUM(VALUE)/1024/1024,2)||'M' AS "SIZE(M)" FROM V$SGA
2 UNION
3 SELECT 'PGA' AS NAME,ROUND(VALUE/1024/1024,2)||'M' AS "SIZE(M)" FROM V$PGASTAT WHERE NAME='TOTAL PGA ALLOCATED'
4 UNION
5 SELECT 'TOTAL' AS NAME,((SELECT ROUND(SUM(VALUE)/1024/1024,2) FROM V$SGA)+(SELECT ROUND(VALUE/1024/1024,2) FROM V$PGASTAT WHERE NAME='TOTAL PGA ALLOCATED'))||'M' AS "SIZE(M)" FROM DUAL
6 UNION
7 SELECT NAME,TO_CHAR(VALUE) FROM V$PGASTAT WHERE NAME='PROCESS COUNT';
NAME SIZE(M)
---------------------------------------------------------------- -----------------------------------------
SGA 52245.7M
TOTAL M