Oracle內存參數調優技術詳解

openkk 12年前發布 | 67K 次閱讀 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單個CPU  db_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    單個CPU  db_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    單個CPU  db_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;

轉自:http://blog.csdn.net/fmhui879/article/details/7259867

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!