引言html
Oracle Server由兩個實體組成:實例(instance)與數據庫(database)。java
實例(instance)包括:內存結構(SGA、PGA)和用戶進程,實例爲用戶同數據庫交互的媒介。算法
數據庫(database)包括:物理結構(數據文件、日誌文件、控制文件等)和邏輯結構(表空間、段、區、塊、等)sql
Oracle內存結構與oracle性能息息相關,內存結構是CPU與IO橋樑,內存結構對於數據庫來講很是重要。數據庫
1、內存結構概述緩存
內存結構主要有:系統全局區(System Global Area簡稱SGA)和(Process Global Area簡稱PGA)組成。服務器
系統全局區SGA:當啓動實例的時候分配,是一組包含一個Oracle實例的數據和控制信息的共享內存結構。網絡
進程全局區PGA:當Server進程創建時分配,此區域包含單個服務器進程或單個後臺進程的數據和控制信息,與幾個進程共享的SGA 正相反。PGA 是隻被一個進程使用的私有區域。PGA 在建立進程時分配,在終止進程時回收。架構
2、系統全局區SGAoracle
1.SGA由幾個內存結構組成
數據高速緩衝區(Database Buffer Cache)
共享池(Shared Pool)
重作日誌緩衝區(Redo Log Cache)
其餘結構(如鎖管理)
附圖:
2.SGA可選內存結構
大池
JAVA池
注:Fixed Sized:Oracle的不一樣平臺和不一樣版本可能不同,對於肯定環境是一個固定值,裏面存儲SGA各部分組件信息,引導創建SGA的區域。
Variable Size:包括share_pool_size、java_pool_size、large_pool_size等內存設置和管理數據緩衝區等內存結構的 Hash table、塊頭信息等。
Datebase Buffers:數據緩衝區,個版本包含的內容不一樣。
Redo Buffers:重作日誌緩衝區的實際大小,和Log_buffer的值稍有不一樣。
SGA的管理:
△9i:SGA總大小由初始化參數SGA_MAX_SIZE肯定。各個內存組件大小之和不能超過這個參數,在這個大小之下,SGA各個內存組件能夠在不重啓數據庫的狀況下直接修改大小,因此叫作SGA的動態管理。
△10g:SGA大小既能夠像9i同樣動態管理,也能夠實施SGA的自動管理。只須要設置初始化參數SGA_TARGET,SGA各個內存組件就能夠由數據庫自動設置大小,設置的依據來源於自動收集的統計信息。
△11g:oracle的內存管理方式能夠根據版本向下兼容,oracle 11g中引入了自動內存管理(Automatic Memory Management),僅用兩個參數完成oracle的內存管理工做,參數說明:MEMORY_TARGET:oracle所能使用的最大內存,該參數能夠動態調整;MEMORY_MAX_TARGET:MEMORY_TARGET參數所能動態設定的最大值,不能動態調整,須要重啓數據庫。
①數據高速緩衝區(Database Buffer Cache):數據高速緩衝區存儲了從數據文件中檢索到的數據塊的鏡像拷貝。
△獲取和修改數據提升了性能
△經過LRU算法管理
△db_block_size決定了主塊大小
△定義緩衝區數取決於db_block_size
②共享池(Shared Pool):存儲最近執行過的sql語句和最近使用過的數據定義。在分析階段,服務器進程使用 SGA 中稱做共享池的區域來編譯 SQL 語句。
△包括兩個與性能有關的內存結構
庫緩存:存儲最近使用的SQL 語句信息。若是從新執行 SQL 語句並且共享 SQL 區域已經包含語句的執行計劃,那麼服務器進程就不須要分析語句。庫高速緩存經過減小分析時間和內存要求來改善從新使用 SQL 語句的應用程序的性能。
數據字典緩存:數據庫中最近使用的定義的集合。它包括有關數據庫文件、表、索引、列、用戶、權限以及其它數據庫對象的信息。
△調整共享池大小(shared_pool_size)
alter system set shared_pool_size = 「X」;
③重作日誌緩衝區(Redo Log Cache):緩存對於數據塊的全部修改,主要用於恢復其中的每一項修改記錄。
△修改記錄叫作重作條目
△重作條目包含重構和重作修改信息
△log_buffer定義大小
注:執行DDL或DML語句時,服務器進程首先將事務變化記載到重作日誌緩衝區,而後纔會修改數據高速緩存。
④大池:一個可選的SGA區域,能夠緩解共享池(Shared Pool)負擔。PARALLEL_AUTOMATIC_TUNING = TURE,大池的空間是動態的,由系統控制。
△主要做用:共享服務器的會話區域(UGA),服務器進程I/O,使用RMAN備份恢復,並行查詢緩存信息。
△不使用LRU鏈表管理
△指定大小,alter system set large_pool_size = 「X」;
△動態指定大小
查看大池已使用或未使用內存
注:若是發現未使用內存很大或者不斷增長,表示大池可能分配了太多的內存,若是未使用內存很小或者不斷減小,表示可能須要加大大池的內存。
⑤java池:可選的SGA區域,屬於SGA中的可變區域,Java池的內存用於存儲全部會話中特定Java程序代碼和JVM中的數據
△java命令須要分析的環境
△安裝使用java須要
△由參數JAVA_POOL_SIZE設置。Java池最大可到1 GB,不能動態調整。
查看java已使用或未使用內存
注:若是發現未使用內存很大或者不斷增長,表示JAVA池可能分配了太多的內存,若是未使用內存很小或者不斷減小,表示可能須要加大JAVA池的內存。
3、進程全局區(PGA)
進程全局區(PGA):此區域包含單個服務器進程或單個後臺進程的數據和控制信息,與幾個進程共享的SGA 正相反。PGA 是隻被一個進程使用的私有區域。PGA 在建立進程時分配,在終止進程時回收。
進程全局區(PGA)包括如下組件:
△排序區:用於處理 SQL 語句時可能須要的任何排序
△會話信息:包括用於會話的用戶權限和性能統計
△遊標狀態:標明處理會話當前使用的 SQL 語句中的階段
△遊標狀態:標明處理會話當前使用的 SQL 語句中的階段
PGA 在建立進程時分配,在終止進程時回收。
擴展閱讀(網絡參考資料,如下資料歸屬網絡做者,請注重「版權」)
http://v.youku.com/v_show/id_XMzQ5OTE0OTQ0.html sga視頻
http://blog.csdn.net/yujin2010good/article/details/7709120 oracle體系結構
http://database.51cto.com/art/201010/231747.htm oracle內存結構SGA
http://blog.csdn.net/robinson_0612/article/details/5534832 oracle10gSGA自動化管理
http://soft.chinabyte.com/database/397/12311397.shtml oracle體系結構介紹
http://blog.csdn.net/yujin2010good/article/details/7709120 oracle體系結構詳解
http://blog.csdn.net/tianlesoftware/article/details/5594080 oracle內存架構詳解
http://vb118.blog.163.com/blog/static/173933100201142531527355/ oracle sga