1. 程式人生 > >Oracle記憶體引數調優技術詳解

Oracle記憶體引數調優技術詳解

前言

近來公司技術,研發都在問我關於記憶體引數如何設定可以優化oracle的效能,所以抽時間整理了這篇文件,以做參考.

目的

希望通過整理此文件,使大家對oracle記憶體結構有一個全面的瞭解,並在實際的工作中靈活應用,使oracle的記憶體效能達到最優配置,提升應用程式反應速度,並進行合理的記憶體使用.

內容

例項結構

oracle例項=記憶體結構+程序結構

oracle例項啟動的過程,其實就是oracle記憶體引數設定的值載入到記憶體中,並啟動相應的後臺程序進行相關的服務過程。

程序結構

oracle程序=伺服器程序+使用者程序

幾個重要的後臺程序

DBWR:資料寫入程序.

LGWR:日誌寫入程序

.

ARCH:歸檔程序.

CKPT:檢查點程序(日誌切換;上一個檢查點之後,又超過了指定的時間;預定義的日誌塊寫入磁碟;例程關閉,DBA強制產生,表空間offline)

LCKn0-9):封鎖程序.

Dnnn:排程程序.

記憶體結構(我們重點講解的)

記憶體結構=SGA(系統全域性區)+PGA(程式全域性區)

SGA:是用於儲存資料庫資訊的記憶體區,該資訊為資料庫程序所共享。它包含Oracle 伺服器的資料和控制資訊,它是在Oracle伺服器所駐留的計算機的實際記憶體中得以分配,如果實際記憶體不夠再往虛擬記憶體中寫

我們重點就是設定SGA,理論上SGA可佔OS系統實體記憶體的1/2——1/3

原則:

SGA+PGA+OS使用記憶體<總物理RAM

SGA=((db_block_buffers*blocksize)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+1MB

1SGA系統全域性區.(包括以下五個區)

A、資料緩衝區:db_block_buffers)儲存由磁碟資料檔案讀入的資料。

大小: db_block_buffers*db_block_size

Oracle9i設定資料緩衝區為:Db_cache_size

原則:SGA中主要設定物件,一般為可用記憶體40%

B、共享池:shared_pool_size

:資料字典,sql緩衝,pl/sql語法分析.加大可提速度。

原則:SGA中主要設定物件,一般為可用記憶體10%

C、日誌緩衝區:log_buffer)儲存資料庫的修改資訊.

原則:128K ---- 1M 之間,不應該太大

D JAVA池(Java_pool_size)主要用於JAVA語言的開發.

原則:若不使用java,原則上不能小於20M,給30M通常就夠了
E
大池(Large_pool_size如果不設定MTS,主要用於資料庫備份恢復管理器RMAN

原則:若不使用MTS,5---- 10M 之間,不應該太大

SGA=. db_block_buffers*db_block_size+ shared_pool_size+ log_buffer+Java_pool+size+large_pool_size

原則:達到可用記憶體的55-58%就可以了.

2PGA程式全域性區

PGA:包含單個伺服器程序或單個後臺程序的資料和控制資訊,與幾個程序共享的SGA 正相反PGA 是隻被一個程序使用的區域,PGA 在建立程序時分配在終止程序時回收.

ASort_area_size 用於排序所佔記憶體

BHash_area_size 用於雜湊聯接,點陣圖索引

這兩個引數在非MTS下都是屬於PGA ,不屬於SGA,是為每個session單獨分配的,在我們的伺服器上除了OS + SGA,一定要考慮這兩部分原則:OS 使用記憶體+SGA+併發執行程序數*(sort_area_size+hash_ara_size+2M) < 0.7*總記憶體

例項配置

一:實體記憶體多大

二:作業系統估計需要使用多少記憶體

三:資料庫是使用檔案系統還是裸裝置

四:有多少併發連線

五:應用是OLTP 型別還是OLAP 型別

基本掌握的原則是, db_block_buffer 通常可以儘可能的大,shared_pool_size 要適度,log_buffer 通常大到幾百K1M就差不多了

A、如果512M RAM 單個CPUdb_block_size 8192 bytes
 SGA=0.55*512M=280M
左右

建議 shared_pool_size = 50M, db_block_buffer* db_block_size = 200M
具體: shared_pool_size =52428800 #50M

db_block_buffer=25600#200M

log_buffer = 131072# 128k (128K*CPU個數)

large_pool_size=7864320#7.5M

java_pool_size = 20971520# 20 M

sort_area_size = 524288# 512k (65k--2M)

sort_area_retained_size = 524288# MTS sort_area_retained_size = sort_area_size

B、如果1G RAM 單個CPUdb_block_size 8192 bytes
SGA=0.55*1024M=563M
左右建議shared_pool_size = 100M , db_block_buffer* db_block_size = 400M
具體: shared_pool_size=104857600#100M

db_block_buffer=51200#400M

 log_buffer = 131072# 128k (128K*CPU個數)

large_pool_size=15728640#15M

java_pool_size = 20971520# 20 M

sort_area_size = 524288# 512k (65k--2M)

sort_area_retained_size = 524288# MTS sort_area_retained_size = sort_area_size

C、如果2G單個CPUdb_block_size 8192 bytes

SGA=0.55*2048M=1126.4M左右建議 shared_pool_size = 200M , db_block_buffer *db_block_size = 800M

具體: shared_pool_size=209715200#200M

db_block_buffer=103192#800M

 log_buffer = 131072# 128k (128K*CPU個數)

large_pool_size=31457280#30M

java_pool_size = 20971520# 20 M

sort_area_size = 524288# 512k (65k--2M)

sort_area_retained_size = 524288# MTS sort_area_retained_size = sort_area_size

假定64 bit ORACLE

記憶體4G

shared_pool_size = 200M , data buffer = 2.5G

記憶體8G

shared_pool_size = 300M , data buffer = 5G

記憶體 12G

shared_pool_size = 300M-----800M , data buffer = 8G

引數更改方式

oracle8i

主要都是通過修改oracle啟動引數檔案進行相關的配置

引數檔案位置:

d:/oracle/admin/DB_Name/pfile/init.ora

按以上修改以上引數值即可。

Oracle9i:

兩種方式:第一種是修改oracle啟動引數檔案後,通過此引數檔案再建立伺服器引數檔案

第二種是直接執行oracle修改命令進行修改。

SQL>alter system set db_cache_size=200M scope=spfile;

SQL>alter system set shared_pool_size=50M scope=spfile;