1. 程式人生 > >Oracle 記憶體結構和程序結構

Oracle 記憶體結構和程序結構

Oracle 記憶體結構如下圖:

1:例項(Instance)        
  在一箇中,每一個執行的Oracle資料庫都與一個數據庫例項相聯絡,例項是我們
 訪問資料庫的手段。
  例項在作業系統中用ORACLE_SID來標識,在Oracle中用引數INSTANCE_NAME來標識,
 它們兩個的值是相同的。資料庫啟動時,系統首先在記憶體中分配系統全域性區(SGA),
 構成了Oracle的記憶體結構,然後啟動若干個常駐記憶體的作業系統程序,即組成了Oracle的
 程序結構,記憶體區域和後臺程序合稱為一個Oracle例項。

資料庫與例項之間是1對1/n的關係,在非並行的資料庫系統中每個Oracle資料庫與一個
 例項相對應;在並行的資料庫系統中,一個數據庫會對應多個例項,同一時間使用者只與一個
 例項相聯絡,當某一個例項出現故障時,其他例項自動服務,保證資料庫正常執行。在任何
 情況下,每個例項都只可以對應一個數據庫。

 2:Oracle 10g動態記憶體管理
  記憶體是影響資料庫效能的重要因素,Oracle8i使用靜態記憶體管理,Oracle 10g使用動態
 記憶體管理。所謂靜態記憶體管理,就是在資料庫系統中,無論是否有使用者連線,也無論併發用
 量大小,只要資料庫服務在執行,就會分配固定大小的記憶體;動態記憶體管理允許在資料庫服
 務執行時對記憶體的大小進行修改,讀取大資料塊時使用大記憶體,小資料塊時使用小記憶體,讀
 取標準記憶體塊時使用標準記憶體設定。


  按照系統對記憶體使用方法的不同,Oracle資料庫的記憶體可以分為以下幾個部分:
  •系統全域性區:SGA(System Global Area)
  •程式全域性區:PGA(Programe Global Area)
  •排序池:(Sort Area)
  •大池:(Large Pool)
  •池:( Pool)

 2-1:系統全域性區SGA(System Global Area)
   SGA是一組為系統分配的共享的記憶體結構,可以包含一個數據庫例項的資料或控制信
  息。如果多個使用者連線到同一個資料庫例項,在例項的SGA中,資料可以被多個使用者共享。
  當資料庫例項啟動時,SGA的記憶體被自動分配;當資料庫例項關閉時,SGA記憶體被回收。
  SGA是佔用記憶體最大的一個區域,同時也是影響資料庫效能的重要因素。
  SGA的有關資訊可以通過下面的語句查詢,sga_max_size的大小是不可以動態調整的。
   =====================================
   SQL> show parameter sga
   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- --------
   lock_sga                             boolean     FALSE
   pre_page_sga                         boolean     FALSE
   sga_max_size                         big integer 164M
   sga_target                           big integer 0
   
   SQL> alter system set sga_max_size=100m;
   alter system set sga_max_size=100m
                 *
   ERROR at line 1:
   ORA-02095: specified initialization parameter cannot be modified
   ======================================  
  

系統全域性區按作用不同可以分為:
   •資料緩衝區
   •日誌緩衝區
   •共享池

  2-1-1:資料緩衝區(Database Buffer Cache)
    如果每次執行一個操作時,Oracle都必須從磁碟讀取所有資料塊並在改變它之後
   又必須把每一塊寫入磁碟,顯然效率會非常低。資料緩衝區存放需要經常訪問的資料,
   供所有使用者使用。修改資料時,首先從資料檔案中取出資料,在資料緩衝區中,
   修改/插入資料也在緩衝區中,commit或DBWR(下面有詳細介紹)程序的其他條
   件引發時,資料被寫入資料檔案。
    資料緩衝區的大小是可以動態調整的,但是不能超過sga_max_size的限制。
   ======================================
   SQL> show parameter db_cache_size
   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- -----------------
   db_cache_size                        big integer 24M
   
   SQL> alter system set db_cache_size=128m;
   alter system set db_cache_size=128m
   *
   ERROR at line 1:
   ORA-02097: parameter cannot be modified because specified value is invalid
   ORA-00384: Insufficient memory to grow cache

   SQL> alter system set db_cache_size=20m;
   System altered.
   
   SQL> show parameter db_cache_size;
   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- -----------------
   db_cache_size                        big integer 20M
   
   #此處我僅增加了1M都不行?
   SQL> alter system set db_cache_size=25m;
   alter system set db_cache_size=25m
   *
   ERROR at line 1:
   ORA-02097: parameter cannot be modified because specified value is invalid
   ORA-00384: Insufficient memory to grow cache

   #修改顯示格式,方便檢視。
   SQL> column name format a40 wrap
   SQL> column value format a20 wrap
   
   #下面語句可以用來檢視記憶體空間分配情況,注意SGA各區大小總和。
   SQL> select name,value from v$parameter where name like '%size' and value <> '0';
   
   #先將java_pool_size調小,然後再修改db_cache_size
   SQL> show parameter java_pool_size;
   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- -----
   java_pool_size                       big integer 48M

   SQL> alter system set java_pool_size=20m;
   System altered.

   SQL> alter system set java_pool_size=30m;
   System altered.
   #上面說明SGA中各區大小總和不能超過sga_max_size。
   =====================================
    資料緩衝區的大小對資料庫的存區速度有直接影響,多使用者時尤為明顯。有些應
   用對速度要求很高,一般要求資料緩衝區的命中率在90%以上。
    下面給出一種計算資料緩衝區命中率的方法:
    •使用資料字典v$sysstat
    =====================================
    SQL> select name, value from v$sysstat
         2  where name in('session logical reads',
         3  'physical reads',
         4  'physical reads direct',
         5  'physical reads direct (lob)')
    NAME                              VALUE
    ------------------------------- ----------
    session logical reads               895243
    physical reads                       14992
    physical reads direct                   34
    physical reads direct (lob)              0
    ======================================
    命中率=1-(14992-34-0)/895243

    可以讓Oracle給出資料緩衝區大小的建議:
    ======================================
    SQL> alter system set db_cache_advice=on;#開啟該功能
    System altered.

    SQL> alter system set db_cache_advice=off;#關閉該功能
    System altered.
    ======================================