Oracle 內存結構


 內存結構

 

Oracle內存,進程與數據庫的圖

 

    

 

    sga:系統全局區,用來存放操作的數據,庫緩存,數據字典等控制信息的內存區域,

     pga:進程全局區,服務進程專用的內存區域,大多數內容非共享

     uga:用來保存用戶的會話信息(如打開的游標,執行語句的私有變量),如果使用專用服務器,則uga在pga中分配,使用共享服務器,則uga在sga中分配。

 

1 sga組成結構

  sga是用來緩存數據庫數據及控制信息的內存結構,大部分共享存在,sga中不同的池

    共享池:share pool 控制大小—shared_pool_size

    Java池 java pool—java_pool_size

    大池 large pool—large_pool_size

    流池 streams pool—streams_pool_size

    數據緩沖區 database buffer cache—db_*_cache_size

    重做日志緩沖區 redolog buffer cache—log_buffer

   另外2個重要的參數,作用於整個sga內存區

   sga_target:控制sga自動內存管理

   sga_max_size:控制實例運行時sga最大能使用的內存空間

   memory_target:用於自動內存管理(11g)

 

1.1 sga相關的初始化參數

9i開始,oracle允許在實例運行中動態的修改sga的內存分配參數,而不需要重啟實例

10g中直接支持修改當前內存參數值:shared_pool_size,large_pool_size,java_pool_size,

streams_pool_size,db_cache_size,sga_target

alter system set db_cache_size=2000m;

sga中設置內存是,oracle已粒度作為單位,粒度大小不能修改,

SQL> show parameter java_pool_size;

NAME                                 TYPE        VALUE

------------------------------------ ----------- --------------

java_pool_size                       big integer 0

SQL> alter system set java_pool_size=5m;

System altered.

SQL> show parameter java_pool_size;

NAME                                 TYPE        VALUE

------------------------------------ ----------- --------------

java_pool_size                       big integer 8M

查看粒度大小

 select component,granule_size from v$sga_dynamic_components

 設置sga中的值時,不能超過sga_max_size的值

要修改db_cache_size的大小:1首先調低其他sga參數的大小,保證能有充分的空間來設置db_cache_size的大小 2 增加sga_max_size的值(物理條件允許),然后在調整db_cache_size,sga_max_size的值不能動態修改,重啟才能生效

1.2 查看sga中的內存分配

show sga

 select * from v$sga

select name,bytes from v$sgainfo—詳細分配信息

自動管理sga

       10g之前,需要手動設置幾個參數值,sga中的內存只能自己使用,無法相互之間共享,

       10g之后,引入sga_target參數,大於0,自動分配,等於0,則有dba手動分配

      Statistics_level,設置為tepical或all,以便收集足夠的統計信息,

        select * from v$parameter where name='statistics_level'

      alter system set sga_target=256m scope=spfile;

       select * from v$parameter where name='sga_target'

 數據緩沖區管理

      在內存中操作數據,數據緩沖區用來存放從數據文件讀取到的數據,數據緩沖區中的數據共享存在,數據一次性獨到緩沖區,只要不被替換出,下次可以繼續在緩沖區中讀取,

3.1 數據在緩沖區中的管理方式

 Oracle通過維護2個列表來管理數據緩沖區中的緩存塊

 寫入列表:維護的是臟塊,數據發生了修改,還未寫到數據文件的數據

 lru(最近最少使用)列表,包含空閑buffer,命中buffer,以及沒來及寫入的臟塊

    Oracle讀取數據,首先檢查數據緩沖區中是否有,沒有則從數據文件中讀取到buffer中,如果沒有足夠的buffer,則去搜索足夠的空間,在搜索的過程中,如果遇到臟塊,則dbwr進程將臟數據塊寫入到數據文件,如果搜索到足夠的空間,則把數據讀到緩沖區中。

剛剛讀到buffer中的數據,並不是出現在mru端中,如全表觸發的數據可能在lru段,具體在那個地方,有oracle決定。

     如果搜索的數據緩存塊達到一定的值,還沒有找到空閑的內存,那oracle將啟動dbwr進程,寫臟數據倒文件,臟塊就會變成空閑塊

 直接從buffer中讀取(數據命中率)

  查詢命中率

   select 1-(sum(decode(name,'physical reads',value,0))/

(sum(decode(name,'db block gets',value,0))+

(sum(decode(name,'consistent gets',value,0))))) "buffer hit ratio" from v$sysstat

 一般低於95%就要注意調整sql

3.2 數據緩存區的大小設置

默認池:默認情況下從數據文件讀取的數據都是存這里,對應初始化參數db_cache_size,

保持池:為了訪問頻繁但是不熱的數據, keep pool,對應參數buffer_pool_keep

回收池:與keep相反,將不需要保存在buffer cache的數據快速替換出緩沖區,對應參數buffer_pool_recycle

數據加載到緩沖區時,存放在那個緩存池由對象的存儲屬性決定,在創建對象時,可以指定storage參數將會把數據加載到那個緩存池

Create table test(a number)storage(buffer_pool_keep)

不指定默認為在默認池

          非標准數據塊大小,db_nk_cache_size:2.4.8.16.32

         SQL> show parameter db_block_size;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- -----

db_block_size                        integer     8192

 alter system set db_16k_block_size=100m scope=spfile;

 create tablespace 16k datafile ‘’size 100m  blocksize 16k;

select name,bytes from v$sgainfo

 共享池管理

      Shared pool是sga中重要的組成部分,庫緩存,數據字典緩存,用於並行執行消息緩存及控制結構組成

  對應參數shared_pool_size

  數據字典緩存,一般v$視圖和dba_*(包含all和user)視圖就存儲在這里,

  庫緩存主要放執行過的sql和plsql,目的是為了重用

select sum(bytes)/1024/1024 mbytes from v$sgastat where pool='shared pool'

5 其他緩沖區管理

5.1 重做日志緩沖區

  對對象的修改inset update create等等都會生成重做記錄,重做日志緩沖區就是用來臨時保存這些重做記錄的區域,對應初始化參數log_buffer

 重做日志緩沖區滿足一定的條件就會觸發后天lgwr進程將其寫到重做日志

   3秒一次

   無論何時有人commit

   要求lgwr切換日志文件

  重做日志緩沖區慢1/3時或者包含了1m的緩存重做日志數據

  查看大小 select * from v$parameter where name='log_buffer'

select name,value/1024/1024 from v$parameter where name='log_buffer'

5.2 大池

Large_pool_size

 執行並行查詢:用來分配和協調並行任務

 Rman備份:用於rman備份的磁盤的i/o緩存區

 Uga:共享服務器連接,uga在這里分配

 

 sga的共享池和數據緩存池的分配

1 v$db_cache_advice 參考值

  用來生成不同大小數據緩存池的開銷

select * from v$db_cache_advice

    2 v$shared_pool_advice

  select * from v$shared_pool_advice

 pga的組成結構

pga是一,每塊保存服務器進程的數據和控制信息的內存結構,oracle進程的專用區域,都非共享個連接到oracle的進程都有自己的pga區域,

  專用服務器:私有sql區,會話內存區

   單個會話允許的最大游標數open_cursors

  Alter system set open_cursors=1000;

  select * from v$parameter where name='open_cursors'

 pga的管理

對於復雜的查詢,pga中有專門的緩沖區,sql工作區

 排序,hash –join,bitmap

pga_aggregate_target是一個上限目標

workarea_size_policy:manual或者auto,默認auto

將workarea_size_policy 設置為auto,Pga_aggregate_target有一個非0的值,oracle就會使用自動pga管理

select * from v$pga_target_advice

pga的參考值,v$pga_target_advice視圖顯示的預估值,需要statistics_level設置為all或者typical才有效。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM