Oracle 數據庫系統中起到調節作用的參數叫初始化參數,數據庫管理員根據實際情況需要適當調整這些 初始化參數以優化Oracle系統。
1 主要系統參數調優介紹
2 系統內存參數的分配
2.1 Oracle 實例= 內存結構 + 進程結構
內存結構 = SGA + PGA
SGA(系統全局區): 用戶存儲數據庫信息的內存區,該區域為數據庫進程所共享。它包含服務器的數據和控制信息,主要包含高速數據緩沖區、共享池、重做日志緩存區、Java池,大型池等內存結構。
SGA的設置,理論上SGA的大小應該占OS的內存的 1/3-1/2左右。
SGA + PGA + OS使用的內存 < 總的物理內存
查看當前系統SGA的信息
select name,bytes/1024/1024 as "Size(M)"
from v$sgainfo;
根據查詢信息顯示當前還有148M可用的SGA內存,系統當前的內存配置並不是最優的,我們在實際使用過程中根據情況可以重新分配內存。
2.2 SGA的設置原則
SGA = (db_block_buffers * db_block_size) + (shared_pool_size + large_pool_size + java_pool_size + log_buffers)
(1)緩沖區高速緩存(database_buffer_cache):主要存儲由磁盤數據文件寫入的數據
大小:db_block_buffers * db_block_size
分配原則:緩沖區高速緩存的調整,用戶進程所存取的所有數據都是經過緩沖區高速緩存來存取,所以該部分的命中率,對性能至關重要。緩沖區高速緩存的使用情況記錄在動態性能表v$sysstat中,可通過查詢該表來了解其活動情況,以決定如何調整。
select name,value from v$sysstat where name in ('dbblock gets','consistent gets','physical reads');
dbblock gets和consistent gets的值是請求數據緩沖區中讀的總次數。physical reads的值是請求數據時引起從盤中讀文件的次數。從緩沖區高速緩存中讀的可能性的高低稱為緩沖區的命中率,計算公式:
Hit Ratio=1-(physical reds/(dbblock gets+consistent gets)) ,
select 1-(phys.value/(cur.value + con.value)) "HIT RATIO"
from v$sysstat cur, v$sysstat con, v$sysstat phys
where cur.name = 'db block gets'
and con.name = 'consistent gets'
and phys.name = 'physical reads';
如果Hit Ratio<60%~70%,則應增大db_block_buffers的參數值。db_block_buffers可以調整分配給緩沖區高速緩存的內存量,即db_block_buffers可設置分配緩沖區高速緩存的數據塊的個數。緩沖區高速緩存的總字節數=db_block_buffers的值*db_block_size的值。db_block_size 的值表示數據塊大小的字節數,可查詢 v$parameter 表:
select name,value
from v$parameter
where name='db_block_size';
在修改了上述數據庫的初始化參數以后,必須先關閉數據庫,在重新啟動數據庫后才能使新的設置起作用。
(2)共享池(shared_pool_size)
分配原則:在shared pool中,主要包含兩個cache,即Library Cache和Data Dictionary Cache,但是不能對它們進行單獨調整,只能通過調整shared_pool_size來進行。
Library Cache用於存放共享SQL語句和PL/SQL語句,采用LRU(Least Recently Used)算法進行管理,Oracle可以用已經cache在其中的SQL語句,而不需要re-parsing,我們可以通過下面的SQL語句來查詢Library Cache的命中率(Hit Ratio):
select GETHITRATIO
from v$librarycache
where namespace ='SQL AREA';
如果得到的結果小於90%,那么說明命中率不高,需要增大Library Cache了。
Data Dictionary Cache的調整,數據字典緩沖區包含了有關數據庫的結構、用戶、實體信息。數據字典的命中率,對系統性能影響極大。數據字典緩沖區的使用情況記錄在動態性能表v$librarycache中,可通過查詢該表來了解其活動情況,以決定如何調整。
select sum(gets),sum(getmisses)
from v$rowcache;
gets列是對相應項請求次數的統計,getmisses 列是引起緩沖區出錯的數據的請求次數。對於頻繁訪問的數據字典緩沖區,sum(getmisses)/sum(gets)<10%。若大於此百分數,則應考慮增加數據字典緩沖區的容量,即需調整初始化參數shared_pool_size來重新調整分配給共享池的內存量。
(3) 大池(large_pool_size ): 主要用於數據庫備份管理器RAM
原則: 根據實際情況
(4) Java池(java_pool_size): 主要用於Java語言開發
原則: 根據實際情況
(5) 日志緩沖區(log_buffers): 存儲數據修改信息
原則:根據實際情況
2.3 PGA 程序全局區
PGA包含單個服務器進程或者單個后台進程的數據和控制信息, 與幾個進程共享的SGA正好相反,是一個只被一個進程使用的區域,PGA在創建進程時分配終止進程時回收。
(1) sort_area_size 用戶排序所占的內存
(2) hash_area_size 用戶散列聯接, 位圖索引
這兩個參數在非MTS模式下都是屬於PGA,是為每個session單獨分配的,在我們的服務器上除了OS + SGA一定要考慮這兩部分大小的設置
OS + SGA + 並發執行的進程數*(sort_area_size + hash_area_size) < 0.7 * OS的總物理內存
3 實例配置
(1) 物理內存大小
(2) 操作系統及其他應用程序需要的內存
(3) 數據庫系統使用的是文件設備還是裸設備
(4) 有多少並發連接
(5) 應用是OLTP還是OLAP類型
基本分配原則,db_block_buffers盡可能的大, shared_pool_size適度, log_buffer通常幾百KB到1M就可以了。
1G內存,1個CPU, db_block_size 為8192B
SGA = 1024 * 0.5 =512 -- 最大一般為OS 內存的一半左右,不超過60%
(1) databse buffer cache:512 * 40% = 205M db_block_buffer應設為:52352(409*1024*1024/8192) -- 一般為sga_max_size的40%
(2) shared_pool_size: 563* 40% = 205M -- 一般為sga_max_size的40%
(3) log_buffer: 128K (128K*CPU個數)
(4) java_pool_size: 4M
(5) large_pool_size: 4M
(6) sort_area_size: 根據實際情況 65K - 2M
(7) sort_area_retained_size: 根據實際情況