首頁  >  文章  >  資料庫  >  歸納整理oracle學習之記憶體分配與調優

歸納整理oracle學習之記憶體分配與調優

WBOY
WBOY轉載
2022-03-11 18:17:382886瀏覽

這篇文章為大家帶來了關於Oracle的相關知識,其中主要介紹了記憶體分配和調優的相關問題,oracle 的記憶體可以按照共享和私有的角度分為系統全局區和進程全域區,也就是SGA和PGA,下面就一起來看一下,希望對大家有幫助。

歸納整理oracle學習之記憶體分配與調優

推薦教學:《Oracle學習教學

一、概述​​

oracle 的記憶體可以依照共享和私有的角度分為系統全域區和進程全域區,也就是SGA和PGA(process global area or private global area)。對於SGA 區域內的記憶體來說,是共享的全域的,在UNIX 上,必須為oracle 設定共享記憶體段(可以是一個或多個),因為oracle 在UNIX 上是多進程;而在WINDOWS 上oracle 是單一進程(多個執行緒),所以不用設定共享記憶體段。 PGA 是屬於行程(執行緒)私有的區域。在 oracle 使用共享伺服器模式下(MTS),PGA中的一部分,也就是 UGA 會被放入共享記憶體 large_pool_size 中。   

       發張圖oracle記憶體架構組成,依照圖上方的顯示可以一目了然關鍵的參數與參數名稱:   

    #  #   

    #  #o

#   

對於SGA 部分,我們透過sqlplus 查詢可以看到:

   

SQL> select * from v$sga; 
  
NAME                VALUE 
  
----------             --------------------
  
Fixed Size                   454032 
  
Variable Size             109051904 
  
Database Buffers             385875968 
  
Redo Buffers                667648
Fixed Size:   

     

Fixed Size:         

oracle 的不同平台和不同版本下可能不一樣,但對於確定環境是一個固定的值,裡面存儲了 SGA 各部分組件的信息,可以看作引導建立 SGA 的區域。    

Variable Size :  

        

包含了 shared_pool_size、java_pool_size、large_pool_size 等記憶體設定   

Database Buffers :    

      

指數 緩緩 衝區:           

在 8i 中包 含 db_block_buffer*db_block_size、buffer_pool_keep、buffer_pool_recycle 三 部 分內 存 。         #  

在 9i 中 套件 包含 db_cache_size 、db_keep_cache_size、db_recycle_cache_size、db_nk_cache_size。    

Redo Buffers :          

指日誌緩衝區,log_buffer。這裡要額外說明一點的是,對於 v$parameter、v$sgastat、v$sga 查詢值可能會不一樣。 v$parameter 裡面的值,是指使用者在初

始化參數檔案裡面設定的值,v$sgastat 是oracle 實際分配的日誌緩衝區大小(因為緩衝區的分配值實際上是離散的,也不是以block 為最小單位進行分配的),

v$sga 裡面查詢的值,是在oracle 分配了日誌緩衝區後,為了保護日誌緩衝區,設定了一些保護頁,通常我們會發現保護頁大小大約是11k(不同環境可能不一樣)。    

二、SGA內參數與設定:                 ##o

2.1 ##

對於日誌緩衝區的大小設置,通常我覺得沒有過多的建議,因為參考 LGWR 寫的觸發條件之後,我們會發現通常超過 3M 意義不是很大。作為一個正式系統,    

可能考慮先設定這部分為 log_buffer=3—5M  大小,然後再針對特定情況再調整。      

log_buffer是Redo log的buffer。      

因此在這裡必須要了解Redo Log的觸發事件(LGWR)     

1、當redo log buffer的容量達到1/3      

2、設定的寫redo log時間間隔到達,一般為3秒鐘。      

3、redo log buffer中重做日誌容量到達1M     

##4、在DBWn將緩衝區中的資料寫入資料文件之前     

5、每一次commit--提交事務。      

上面的結論可以換句話說     

1、log_buffer中的內容滿1/3,快取刷新一次。      

2、最長間隔3秒鐘,快取刷新一次     

3、log_buffer中的資料到達1M,快取刷新一次。      

4、每次提交一個“事務”,緩存刷新一次     

2.2 Large_pool_size      

對於大緩衝池的設置,假如不使用MTS,建議在20—30M  足夠了。這部分主要用來保存並行查詢時候的一些信息,還有就是 RMAN 在備份的時候可能會使用到。    

如果設定了MTS,則由於 UGA 部分要移入這裡,則需要具體根據 server process 數量和相關會話記憶體參數的設定來綜合考慮這部分大小的設定。      

2.3  Java_pool_size #    

假如資料庫沒有使用 JAVA,我們通常認為保留 10—20M 大小足夠。事實上可以更少,甚至最少只需要 32k,但具體跟安裝資料庫的時候的元件相關(例如 http server)。      

2.4  Shared_pool_size   

Shared_pool_size的開銷通常應維持在300M 以內。除非系統使用了大量的預存程序、函數、套件,  

例如 oracle erp 這樣的應用,可能會達到 500M 甚至更高。於是我們假定一個 1G 記憶體的系統,可能會考慮

設定此參數為100M,2G 的系統考慮設定為150M,8G 的系統可以考慮設定為200—300M   

2.5SGA_MAX_SIZE    

SGA區包含了各種緩衝區和記憶體池,而大部分都可以透過特定的參數來指定他們的大小。但是,作為一個昂貴的資源,一個系統的實體記憶體大小是有限。

儘管對於CPU的記憶體定址來說,是無需關係實際的物理記憶體大小的(關於這一點,後面會做詳細的介紹),但是過多的使用虛擬記憶體導致page in/out,    

會大幅影響系統的效能,甚至可能會導致系統crash。所以需要有一個參數來控制SGA使用虛擬記憶體的最大大小,這個參數就是SGA_MAX_SIZE。當實例啟動後,    

各個記憶體區只分配實例所需的最小大小,在隨後的運行過程中,再根據需要擴展他們的大小,而他們的總和大小受到了SGA_MAX_SIZE的限制。      

對於OLTP系統,參考:   

##系統內存

SGA_MAX_SIZE值

#######1G#########################400-500M################################################################################################################################################################################################## ##### ########################2G#########################1G# #############################4G#################### ####2500M###############################8G################################################################################ ##########5G######################

2.6 PRE_PAGE_SGA   

oracle執行個體啟動時,會只載入各個記憶體區最小的大小。而其他SGA記憶體只作為虛擬記憶體分配,  

只有當進程touch到對應的頁面時,才會置換到實體記憶體中。但我們或許希望實例一啟動後,所有SGA  

都分配到實體記憶體。這時就可以透過設定PRE_PAGE_SGA參數來達到目的了。這個參數的預設值  

為FALSE,即不將全部SGA置入實體記憶體中。設定為TRUE時,實例啟動會將全部SGA置入物理  

記憶體中。它可以使實例啟動達到它的最大效能狀態,但是,啟動時間也會更長(因為為了讓所有SGA  

都置入實體記憶體中,oracle進程需要touch所有的SGA頁)。    

2.7 LOCK_SGA   

##為了確保SGA都鎖定在實體記憶體中,而不必頁入/頁出,可以透過參數LOCK_SGA來控制。  

這個參數預設值為FALSE,當指定為TRUE時,可以全部SGA鎖定在物理記憶體中。當然,  

有些系統不支援記憶體鎖定,這個參數也就無效了。    

2.8 SGA_TARGET   

##這裡要介紹的時Oracle10g中引入的一個非常重要的參數。在10g之前,SGA的各個記憶體區

 

的大小都需要透過各自的參數指定,並且都無法超過參數指定大小的值,儘管他們總和可能並

 

沒有達到SGA的最大限制。此外,一旦分配後,各區的記憶體只能給本區使用,彼此之間是不能共享的。

 

拿SGA中兩個最重要的記憶體區Buffer Cache和Shared Pool來說,它們兩個對實例的效能影響最大,

 

但是有這樣的矛盾存在:在記憶體資源有限的情況下,某些時候資料被cache的需求非常大,

 

為了提高buffer hit,就需要增加Buffer Cache,但由於SGA有限,只能從其他區「搶」過來-如縮小Shared Pool,

 

增加Buffer Cache;而有時又有大塊的PLSQL程式碼被解析駐入記憶體中,導致Shared Pool不足,

 

甚至出現4031錯誤,又需要擴大Shared Pool,這時可能需要人為幹預,從Buffer Cache中將記憶體奪回來。

   

        有了這個新的特性後,SGA中這個記憶體的矛盾就迎刃而解了。這項特性稱為自動共享記憶體管理

 

(Automatic Shared Memory Management ASMM)。而控制這特性的,也就只是這一個參數SGA_TARGE。

 

設定這個參數後,你就不需要為每個記憶體區來指定大小了。 SGA_TARGET指定了SGA可以使用的最大記憶體大小,

 

而SGA中各記憶體的大小由Oracle自行控制,不需要人為指定。 Oracle隨時可以調整各區域的大小,使其達到系所

 

統性能最佳狀態的個最合理大小,並且控制他們總和在SGA_TARGET指定的值之內。一旦給SGA_TARGET指定值後

 

(預設為0,即沒有啟動ASMM),就自動啟動了ASMM特性。

   

三、oracle 内存调优办法   

当项目的生产环境出现性能问题,我们如何通过判断那些参数需要调整呢?   

3.1 检查ORACLE实例的Library Cache命中率:   

 标准:一般是大于99%                   检查方式:

select 1-(sum(reloads)/sum(pins)) "Library cache Hit Ratio" from v$librarycache;

 处理措施:    如果Library cache Hit Ratio的值低于99%,应调高shared_pool_size的大小。通过sqlplus连接数据库执行如下命令,调整shared_pool_size的大小:    

SQL>alter system flush shared_pool;
    
SQL>alter system set shared_pool_size=设定值 scope=spfile;

3.2 检查ORACLE实例的Data Buffer(数据缓冲区)命中率:   

 标准:一般是大于90%     检查方式:    

select 1 - (phy.value / (cur.value + con.value)) "HIT RATIO"
    from v$sysstat cur, v$sysstat con, v$sysstat phy
   
 where cur.name = 'db block gets'
    and con.name = 'consistent gets'
     and phy.name = 'physical reads';

处理措施:    

如果HIT RATIO的值低于90%,应调高db_cache_size的大小。通过sqlplus连接数据库执行如下命令,    

调整db_cache_size的大小    

SQL>alter system set db_cache_size=设定值 scope=spfile

3.3 检查ORACLE实例的Dictionary Cache命中率:     

标准:一般是大于95%       

检查方式:       

select 1 - (sum(getmisses) / sum(gets)) "Data Dictionary Hit Ratio"       
  from v$rowcache;

处理措施:       

如果Data Dictionary Hit Ratio的值低于95%,应调高shared_pool_size的大小。通过sqlplus连接数据库执行如下命令,调整shared_pool_size的大小:       

SQL>alter system flush shared_pool;       
SQL>alter system set shared_pool_size=设定值 scope=spfile;

3.4  检查ORACLE实例的Log Buffer命中率:     

标准:一般是小于1%       

检查方式:      

select (req.value * 5000) / entries.value "Ratio"       
  from v$sysstat req, v$sysstat entries       
 where req.name = 'redo log space requests'       
   and entries.name = 'redo entries';

处理措施:       

如果Ratio高于1%,应调高log_buffer的大小。通过sqlplus连接数据库执行如下命令,调整log_buffer的大小:       

SQL>alter system set log_buffer=设定值 scope=spfile;

3.5 检查undo_retention:     

标准:undo_retention 的值必须大于max(maxquerylen)的值       

检查方式:       

col undo_retention format a30
      
select value "undo_retention" from v$parameter where name='undo_retention';
      
select max(maxquerylen) From v$undostat Where begin_time>sysdate-(1/4);

处理措施:       

如果不满足要求,需要调高undo_retention 的值。通过sqlplus 连接数据库执行如下命令,调整undo_retention 的大小:       

SQL>alter system set undo_retention= 设定值 scope=spfile;

注:    

32bit  和 64bit  的问题    

对于 oracle 来说,存在着 32bit 与 64bit 的问题。这个问题影响到的主要是 SGA 的大小。在 32bit 的数据库下,通常 oracle 只能使用不超过 1.7G 的内存,即使我们拥有 12G 的内存,但是我们却只能使用 1.7G,这是一个莫大的遗憾。假如我们安装 64bit 的数据库,我们就可以使用很大的内存,我们几乎不可能达到上限。但是 64bit 的数据库必须安装在 64bit 的操作系统上,可惜目前 windows 上只能安装 32bit 的数据库,我们通过下面的方式可以查看数据库是 32bit 还是 64bit     

    但是在特定的操作系统下,可能提供了一定的手段,使得我们可以使用超过 1.7G 的内存,达到 2G 以上甚至更多。    

推荐教程:《Oracle教程

以上是歸納整理oracle學習之記憶體分配與調優的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除