您好,登錄后才能下訂單哦!
這篇文章主要介紹了Oracle SGA是什么意思,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
SGA(System Global Area)系統全局區。這是一個非常龐大的內存區間,也是為什么開啟oracle之后占用了很大內存的原因。
SGA分為不同的池,我們可以通過視圖v$sgastat查看,如下所示。
SQL> select pool ,sum(bytes) bytes from v$sgastat group by pool;
POOL BYTES
------------ ----------
956298240
java pool 16777216
streams pool 16777216
shared pool 199783376
large pool 16777216
SQL>
我們可以看到SGA由java pool(java 池)、shared pool(共享池)、large pool(大池) 和沒有名字的池組成。其中那塊沒有名字的內存又包括塊緩沖區(緩存的數據庫塊)、重做日志緩沖區和“固定SGA”區專用的內存。
oracle SGA內存結構如下所示:
下面逐個介紹:
1、Fixed SGA 固定SGA
可以把這個區想成是 SGA中的“自啟”區,Oracle在內部要使用這個區來找到SGA的其他區。換一句話,就是在這個內存里面存有其他區的地址,我們可以通過訪問這個區來查找到其他區的位置!
2、Redo Buffer 重做緩沖區
如果數據需要寫到在線重做日志中,則在寫至磁盤之前要在重做緩沖區(redo buffer)中臨時緩存這些數據。由于內存到內存的傳輸比內存到磁盤的傳輸快得多,因此使用重做日志緩沖區可以加快數據庫的操作。我的理解是,如果沒有這個區,那我們操作一次數據庫就訪問一次磁盤,而如果有的話,則可以操作很多次之后才訪問一次磁盤。速度當然要快很多了。
3、Block Buffer 塊緩沖區緩存
Oracle將數據庫塊寫至磁盤之前,另外從磁盤讀取數據庫塊之后,就會把這些數據庫塊存儲在塊緩沖區緩存(block buffer cache)中。對我們來說,這是SGA中一個很重要的區。如果太小,我們的查詢就會永遠也運行不完。如果太大,又會讓其他進程饑餓(例如,沒有為專用服務器留下足夠的空間來創建其PGA,甚至無法啟動)。這個其實是緩存數據,也是為什么你第二次進行同一個操作的時候比第一次要快的原因,因為他可以直接從這個緩存里面取就可以了!但是如果你第二天來繼續進行同一操作應該是比較慢的,因為在那個緩存里面已經沒有你要取的數據了!( 就是通常說的內存老化,也就是緩存你數據的那塊內存被別人用了。這就是LRU算法),為了使自己要的數據不那么快老化。oracle把這塊內存劃分為三種類型:
默認池(default pool):所有段塊一般都在這個池中緩存。這就是原先的緩沖區池(原來也只有一個緩沖區池)。
保持池(keep pool):按慣例,訪問相當頻繁的段會放在這個候選的緩沖區池中,如果把這些段放在默認緩沖區池中,盡管會頻繁訪問,但仍有可能因為其他段需要空間而老化(aging)。
回收池(recycle pool):按慣例,訪問很隨機的大段可以放在這個候選的緩沖區池中,這些塊會導致過量的緩沖區刷新輸出,而且不會帶來任何好處,因為等你想要再用這個塊時,它可能已經老化退出了緩存。要把這些段與默認池和保持池中的段分開,這樣就不會導致默認池和保持池中的塊老化而退出緩存。
4、shared pool(共享池)
共享池就是Oracle緩存一些“程序”數據的地方。在解析一個查詢時,解析得到的表示(representation)就緩存在那里。在完成解析整個查詢的任務之前, Oracle會搜索共享池,看看這個工作是否已經完成。你運行的PL/SQL代碼就在共享池中緩存,所以下一次運行時,Oracle不會再次從磁盤重新讀取。PL/SQL代碼不僅在這里緩存,還會在這里共享。如果有1 000個會話都在執行同樣的代碼,那么只會加載這個代碼的一個副本,并由所有會話共享。Oracle把系統參數存儲在共享池中。數據字典緩存(關于數據庫對象的已緩存信息)也存儲在這里。簡單地講,就像是廚房的水池一樣,什么東西都往共享池里放。我的理解是:這是個共用的東西,大家都可以用。比如一個用戶進行一次查詢,在解析之前,查看共享池,這個sql語句是否已經緩存在這里了。如果在,他就沒有必要再去進行解析了,因為已經解析好了,直接拿來用就可以了!這也是綁定變量為什么可以改善oracle性能的原因!
5、large pool 大池
大池(large pool)并不是因為它是一個“大”結構才這樣取名(不過,它可能確實很大)。之所以稱之為大池,是因為它用于大塊內存的分配,共享池不會處理這么大的內存塊。
在Oracle 8.0引入大池之前,所有內存分配都在共享池中進行。如果你使用的特性要利用“大塊的”內存分配(如共享服務器UGA內存分配),倘若都在共享池中分配就不太好。另外,與共享池管理內存的方式相比,處理(需要大量內存分配)會以不同的方式使用內存,所以這個問題變得更加復雜。共享池根據LRU來管理內存,這對于緩存和重用數據很合適。不過,大塊內存分配則是得到一塊內存后加以使用,然后就到此為止,沒有必要緩存這個內存。我的理解是:其實是把原來屬于共享池里面的一些特殊的內存拿出來進行不同的處理。因為這些內存用完之后就可以立即釋放,而共享池的內存不存在釋放問題,因為是大家共享的。
大池專門用于以下情況:
共享服務器連接,用于在SGA中分配UGA區,因為一個用戶斷開之后,UGA就可以立即釋放!
語句的并行執行,允許分配進程間的消息緩沖區,這些緩沖區用于協調并行查詢服務器。一旦發送了緩沖消息就可以立即釋放!
備份,在某些情況下用于RMAN磁盤I/O 緩沖區。因為寫入磁盤之后,這些緩存可以立即釋放!
6、Java pool Java池
在數據庫中運行Java代碼時用到這部分內存。例如:編寫Java存儲過程在服務器內運行。需要注意的是,該內存與常見的Java編寫的B/S系統并沒關系。用JAVA語言代替PL/SQL語言在數據庫中寫存儲過程才會用到這部分內存。
7、Stream pool 流池
9iR2以上增加了“流”技術,10g以上在SGA中增加了流池。流是用來共享和復制數據的工具。
SGA設置
沒有通用的設置,所有設置都要根據系統的負載、業務需求和硬件環境來進行調整。這里只是總結出大體的設定,避免因SGA設置不當引起的問題。
1、自動SGA內存管理
在Oracle 10g中引入了自動SGA內存管理特性,DBA可以設定SGA_TARGET告訴Oracle可用的SGA內存為多大,由Oracle根據系統負載來動態調整各組件大小,相應的數定會保存在控制文件中,使數據庫重啟后也記得各組件大小。
需要注意一下幾點:
? 要使用自動SGA內存管理,STATISTICS_LEVEL參數必須設為TYPICAL或ALL,系統自動收集相應的信息用來動態調整SGA設定。
? 可以設定某個組件的值,Oracle使用此值為該組件的最小大小。
可動態調整的參數:
DB_CACHE_SIZE,SHARED_POOL_SIZE,LARGE_POOL_SIZE,JAVA_POOL_SIZE。
需手動設置的參數:
LOG_BUFFER,STREAMS_POOL,DB_NK_CACHE_SIZE,DB_KEEP_CACHE_SIZE,DB_RECYCLE_CACHE_SIZE。
2、手動SGA內存管理
1) 32bit和64bit限制
在32位的操作系統中,Oracle最大可用內存為1.75g,也就是說SGA+PGA<=1.75g,超過這一限制的內存將不會被Oracle用到。
32位的Oracle可以裝到64位的操作系統上,64位的Oracle不可以裝到32位的操作系統上。
2) 查看Oracle版本:
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
3) 各組件設置:
JAVA_POOL_SIZE:如果沒用到數據庫端java的系統,30MB足夠。
LOG_BUFFER:默認為MAX(512KB,128KB*CPU個數)。一般系統1MB足夠,運行大型事務的系統可以設為2MB,讓1/3滿寫入日志文件時可以繼續寫入緩沖,再大也沒有意義。
SHARED_POOL_SIZE:過大過小都會嚴重影響系統性能,1GB內存可以設為100MB,2GB內存可設為150MB,4GB內存可設為300MB。共享池命中過低首先要調整的是應用程序而不是擴大共享池。使用綁定變量可以減少共享池需求、提高命中率,減少共享池管理負擔和LATCH競爭。
LARGE_POOL_SIZE:使用專用服務模式可設為30MB,除非必要,不然不建議使用共享服務器模式。
DB_CACHE_SIZE:除去上述內存外其他可用內存都分配給該區域。
總結
32位Oracle:
1G內存:SHARED_POOL_SIZE=100MB,DB_CACHE_SIZE=0.5GB;
2G內存:SHARED_POOL_SIZE=150MB,DB_CACHE_SIZE=1.25GB;
64位Oracle
4G內存:SHARED_POOL_SIZE=200MB,DB_CACHE_SIZE=2.5GB;
8G內存:SHARED_POOL_SIZE=400MB,DB_CACHE_SIZE=5GB;
12G內存:SHARED_POOL_SIZE=500MB,DB_CACHE_SIZE=8GB
再次強調,以上只是避免因SGA設置不當引起問題的大體設置,需要根據具體的系統負載和業務邏輯結合Stackpack等工具細調。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Oracle SGA是什么意思”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。