內存結構
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—詳細分配信息
2 自動管理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 數據緩沖區管理
在內存中操作數據,數據緩沖區用來存放從數據文件讀取到的數據,數據緩沖區中的數據共享存在,數據一次性獨到緩沖區,只要不被替換出,下次可以繼續在緩沖區中讀取,
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
4 共享池管理
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在這里分配
6 sga的共享池和數據緩存池的分配
1 v$db_cache_advice 參考值
用來生成不同大小數據緩存池的開銷
select * from v$db_cache_advice
2 v$shared_pool_advice
select * from v$shared_pool_advice
6 pga的組成結構
pga是一,每塊保存服務器進程的數據和控制信息的內存結構,oracle進程的專用區域,都非共享個連接到oracle的進程都有自己的pga區域,
專用服務器:私有sql區,會話內存區
單個會話允許的最大游標數open_cursors
Alter system set open_cursors=1000;
select * from v$parameter where name='open_cursors'
8 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才有效。