共計 4329 個字符,預計需要花費 11 分鐘才能閱讀完成。
這篇文章主要介紹了 Oracle SGA 是什么意思,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。
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 等工具細調。
感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“Oracle SGA 是什么意思”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!