cAng^Er

          不懂我的人 , 離不了我 , 該了解了解我 !而懂我的人 , 更離不了我 , 因?yàn)樗麄儛畚?。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            30 隨筆 :: 16 文章 :: 18 評(píng)論 :: 0 Trackbacks
          原文:http://blog.csdn.net/hxf0759/archive/2009/04/09/4060493.aspx

          SGA——Oracle的系統(tǒng)全局空間
          SGA——數(shù)據(jù)高速緩存池(DB Buffer)
            |                             |—————————默認(rèn)緩存池
            |                             |—————————保持緩存池
            |                             |—————————再生緩存池
            |
            |———共享緩存池
            |               |————————庫緩存區(qū)
            |               |                             |——————共享SQL區(qū)(已編譯的SQL)
            |               |                             |——————PL/SQL區(qū)(過程、函數(shù)等..)
            |               |
            |               |————————數(shù)據(jù)字典緩存區(qū)(常用的表名、列名等用于解析SQL語句的內(nèi)容)
            |
            |———Redo日志緩存區(qū)
            |———大共享區(qū)(可選的特征)
            |———固定SGA


          內(nèi)存結(jié)構(gòu)與動(dòng)態(tài)內(nèi)存管理
           

          內(nèi)存是影響數(shù)據(jù)庫性能的重要因素。
            oracle8i使用靜態(tài)內(nèi)存管理,即,SGA內(nèi)是預(yù)先在參數(shù)中配置好的,數(shù)據(jù)庫啟動(dòng)時(shí)就按這些配置來進(jìn)行內(nèi)在分配,oracle10g引入了動(dòng)態(tài)內(nèi)存管理,即在數(shù)據(jù)庫運(yùn)行過程中,內(nèi)存大小可以在線修改與自動(dòng)配置。
            oracle數(shù)據(jù)庫的內(nèi)存可以分為:系統(tǒng)全局區(qū)、程序全局區(qū)、排序區(qū)、大池、java池。

          一、系統(tǒng)全局區(qū)(SGA)

            系統(tǒng)全局區(qū)的數(shù)據(jù)被多個(gè)用戶共享。當(dāng)數(shù)據(jù)庫實(shí)例啟動(dòng)時(shí),系統(tǒng)全局區(qū)內(nèi)存被自動(dòng)分配。SGA按作用的不同,又分為:數(shù)據(jù)緩沖區(qū)、日志緩沖區(qū)、共享池。

          1.數(shù)據(jù)緩沖區(qū)
            數(shù)據(jù)緩沖區(qū)用于存儲(chǔ)從磁盤數(shù)據(jù)文件中讀入的數(shù)據(jù),供所有用戶共享。修改、插入的數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)緩沖區(qū)中,修改完成或DBWR進(jìn)程執(zhí)行時(shí),數(shù)據(jù)被寫入數(shù)據(jù)文件。

            幾個(gè)概念:
          LRU:最近最少使用,系統(tǒng)按這個(gè)原則對(duì)緩沖區(qū)中的數(shù)據(jù)進(jìn)行替換。
          Dirty:臟數(shù)據(jù),指修改后還沒有寫到數(shù)據(jù)文件中的數(shù)據(jù)。

            在9i之前,數(shù)據(jù)緩沖區(qū)的大小是由DB_BLOCK_BUFFER確定,之后的版本中,是由參數(shù)DB_CACHE_SIZE及DB_nK_CACHE_SIZE確定。不同的表空間可以使用不同的塊大小,在創(chuàng)建表空間中加入?yún)?shù)BLOCKSIZE指定該表空間數(shù)據(jù)塊的大小,如果指定的是2k,則對(duì)應(yīng)的緩沖區(qū)大小為DB_2K_CACHE_SIZE參數(shù)的值,如果指定的是4k,則對(duì)應(yīng)的緩沖區(qū)大小為DB_4K_CACHE_SIZE參數(shù)的值,以此類推。如果不指定BLOCKSIZE,則默認(rèn)為參數(shù)DB_BLOCK_SIZE的值,對(duì)應(yīng)的緩沖區(qū)大小是DB_CACHE_SIZE的值。

            緩沖區(qū)的設(shè)置對(duì)性能影響是很突出的。設(shè)一個(gè)查詢要讀取的數(shù)據(jù)塊數(shù)為A,能夠從緩沖區(qū)讀取到的數(shù)據(jù)塊數(shù)為C,需要從磁盤讀取的數(shù)據(jù)塊數(shù)為D,那么A+C+D,則C/A稱為數(shù)據(jù)緩沖區(qū)的命中率。以下語句計(jì)算數(shù)據(jù)緩沖區(qū)的命中率:

          SQL>SELECT A.VALUE+B.VALUE "LOGICAL_READS",C.VALUE "PHYS_READS",
              ROUND(100*((A.VALUE+B.VALUE)-C.VALUE)/(A.VALUE+B.VALUE)) "BUFFER HIT RATIO"
              FROM V$SYSSTAT A,V$SYSSTAT C
              WHERE A.STATICSTIC#=38 AND B.STATISTIC#=39 AND C.STATICSTIC#=40
          一般要求命中率在90%以下,如果命中率太低,就應(yīng)適當(dāng)調(diào)整數(shù)據(jù)緩沖區(qū)的大小。
          2.日志緩沖區(qū)
            日志緩沖區(qū)用于緩沖事務(wù)日志,在適當(dāng)?shù)臅r(shí)候再由LGWR進(jìn)程寫入日志文件。日志緩沖區(qū)的大小由參數(shù)LOG_BUGGER設(shè)定。


            日志在進(jìn)入日志緩沖區(qū)時(shí),如果日志緩沖區(qū)過小而沒有空閑空間,就要等待LGWR將緩沖區(qū)中原有的日志寫入日志文件以騰出空閑空間。如果有足夠的空閑空間,則無需等待,直接寫入日志緩沖區(qū)中。那么這個(gè) 等待的次數(shù)/總次數(shù)(等待+非等待) 就稱為日志緩沖區(qū)的失敗率,可以通過以下語句計(jì)算:
          sql>select name,gets,misses,immediate_get,immediate_misses,
              decode(gets,0,0,misses/gets*100 ratio1,
              decode(immediate_gets+immdiate_misses,0,0,immediate_misses/(immdiate_gets+immediate_misses)*100) ratio2
              from v$latch where name in ('redo allocation','redo copy');
            顯然,失敗率也是影響性能的重要因素,就要實(shí)際情況調(diào)整log_buffer的大小。

          3.共享池
            共享池是對(duì)sql,pl/sql程序進(jìn)行語法分析,編譯,執(zhí)行的內(nèi)存區(qū)域。包括:庫緩沖區(qū)(library cache),數(shù)據(jù)字典緩沖區(qū)(data dictinary cache),用戶全局區(qū)(user global area)三個(gè)部分。


            共享池的大小由參數(shù)shared_pool_size設(shè)定。
            查詢數(shù)據(jù)字典的成功與失敗次數(shù):
          sql>select sum(gets) "dictionary gets",
                     sum(getmisses) "dictionary cache getmisses",
                     from v$rowcache
             計(jì)算共享池記取數(shù)據(jù)字典的成功率:
          sql>select parameter,gets,getmisses,getmisses/(gets+getmisses)*100 "miss ratio",(1-sum(getmisses)/sum(gets)+sum(getmisses))))*100 "hit ratio" from v$rowcache where gets+getmisses<>0 group by parameter,gets,getmisses;
            計(jì)算緩存的失敗率,結(jié)果應(yīng)小于1%:
          sql>select sum(pins) "total pins",sum(reloads) "total reloads",
                     sum(reloads)/sum(pins)*100 libcahe from v$librarycache;

            以上分析了SGA的三個(gè)部分,要查看SGA的總大小或空閑空間,使用比率,如下:
          sql>select * from v$sga
          sql>select name,sgasize/1024/1024 "allocated(m)",bytes/1024 "空閑空間百分比(%)" from (select sum(bytes) sgasize from sys.v_$sgastat) s,sys.v_sgastat f where f.name='free mamory';

          二、程序全局區(qū)


            程序全局區(qū)(PGA)是包含單個(gè)用戶或服務(wù)器數(shù)據(jù)的控制信息的內(nèi)存區(qū)域。是在用戶進(jìn)程連接到oracle數(shù)據(jù)庫并創(chuàng)建一個(gè)會(huì)話時(shí),由oracle自動(dòng)分配的,它是非共享區(qū),主要用于在編程時(shí)存儲(chǔ)變量與數(shù)組。會(huì)話結(jié)束時(shí),PGA被釋放。

          三、排序區(qū)


            排序區(qū)用于sql的order by。oracle優(yōu)先使用排序區(qū)進(jìn)行排序,如果內(nèi)存不夠,oracle自動(dòng)使用臨時(shí)表空間進(jìn)行排序。
            參數(shù)sort_area_size用于設(shè)置排序區(qū)的大小。

          四、大池


            大池用于數(shù)據(jù)庫備份工具-RMAN。
            大池的大小由參數(shù)large_pool_size確定。

          五、java池


            從8i開始,oracle增加了對(duì)java的支持,所以系統(tǒng)提供了java池,其大小由參數(shù)java_pool_size設(shè)定。

          六、oracle10g的自動(dòng)共享內(nèi)存管理


          1.什么是自動(dòng)共享內(nèi)存管理?
            在10g以前的版本中,SGA的各個(gè)部分,share_pool_size,db_cache_size等需要由管理員手動(dòng)設(shè)置大小,當(dāng)數(shù)據(jù)庫負(fù)荷太大時(shí),若沒有調(diào)整這些參數(shù)的大小,就會(huì)產(chǎn)生“無法分配內(nèi)存”的錯(cuò)誤。在10g中,將參數(shù)statistics_level設(shè)置為typecal 或all,再使用新參數(shù)SGA_TARGET設(shè)置SGA內(nèi)存區(qū)的部大小即可,無需定義每個(gè)參數(shù)的大小,系統(tǒng)會(huì)根據(jù)需要自動(dòng)在多個(gè)組件之間分配內(nèi)存大小。

          2.自動(dòng)共享內(nèi)存管理時(shí),設(shè)置SGA各部分內(nèi)存參數(shù)的最小值限制
            如果同時(shí)設(shè)置了SGA_TARGET和各內(nèi)存參數(shù),如:
          SGA_TARGET=300M
          SHARED_POOL_SIZE=32M
          DB_CACHE_SIZE=90M
          則表示共享池和數(shù)據(jù)緩沖區(qū)至少會(huì)分配32M和90M內(nèi)存,剩下的可由系統(tǒng)自動(dòng)分配的內(nèi)存為:
          300-32-90=172M

          3.手動(dòng)內(nèi)存管理轉(zhuǎn)換為自動(dòng)管理
            只要設(shè)置新參數(shù)SGA_TARGET即可,如:
          SGA_TARGET=1000M
             在自動(dòng)內(nèi)存管理模式下,如果數(shù)據(jù)庫使用SPFILE,那么在數(shù)據(jù)庫關(guān)閉后,系統(tǒng)會(huì)將上一次數(shù)據(jù)庫關(guān)閉時(shí)的內(nèi)存分配狀態(tài)記錄下來。因此,如果是自動(dòng)內(nèi)存管理,最好使用SPFILE而非PFILE。

           

          本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/hxf0759/archive/2009/04/09/4060493.aspx

          posted on 2011-02-23 10:34 cAng^Er 閱讀(120) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 电白县| 克什克腾旗| 凯里市| 鄱阳县| 厦门市| 大连市| 都江堰市| 青龙| 壶关县| 九江市| 南丰县| 博白县| 田阳县| 元阳县| 万宁市| 乐昌市| 蓝山县| 崇仁县| 辽阳市| 济阳县| 十堰市| 衢州市| 北京市| 丘北县| 朝阳市| 余庆县| 兰西县| 贵州省| 罗源县| 赤水市| 桓仁| 多伦县| 白河县| 涡阳县| 博罗县| 澄江县| 乌海市| 沛县| 淮安市| 天台县| 冀州市|