【翻譯】記憶體結構 (一)

yellowlee發表於2009-08-14

讀文件容易,翻譯難。先試試手。未完待續。

oracle 9i concepts
part III The oralce instance
7.memory architecture
本節討論oracle例項的記憶體結構,主要包括:
.oracle 記憶體結構介紹
.系統全域性區(sga)概述
.程式全域性區(pga)概述
.專用和共享伺服器
.軟體程式碼區

.oracle 記憶體結構介紹
 oracle的記憶體用來儲存以下資訊:
 .程式程式碼
 .連線會話資訊,包括當前不活動的連線
 .程式執行期間所需的資訊(例如:當前被查詢取出的行的狀態)
 .共享資訊和oracle程式間通訊資訊(例如:鎖)
 .緩衝資料(例如:資料塊,重做日誌條目)
 oracle基礎記憶體結構包括:
 .系統全域性區,由所有服務和後臺程式共有:
  - 資料庫快取
  - 重做日誌快取
  - 共享池
  - 大池(如果已經設定的話)
 下圖顯示了這些儲存結構之間的關係:
 
 軟體程式碼區是另外一個基礎記憶體結構,在7-22討論
 參考:
  ."系統全域性區(sga)概覽" 7-3
  ."程式全域性區(pga)概覽" 7-17
 
 系統全域性區(sga)概覽
  系統全域性區是包括oracle資料庫例項的資料和控制資訊的一組共享的記憶體結構。如果多個使用者
  當前連線同一個例項,那麼例項的sga中的資料被所有使用者共享。因此,sga有時候也被叫做共享
  全域性區。
  
  sga和oracle程式構成一個oracle例項。啟動一個例項時,oracle自動為sga分配記憶體,當關閉例項
  時,作業系統回收記憶體。每個例項都擁有獨自的sga。
  
  sga是可讀可寫的。所有連線的使用者可以讀例項sga中的資訊,並且一些程式可以寫sga。
  sga包含以下的資料結構:
   .資料庫快取
   .重做日誌快取
   .共享池
   .java池
   .大池(可選)
   .資料字典快取
   .其他資訊
  sga中包含了部分資料庫和例項的狀態資訊,後臺程式需要訪問,這部分叫做fixed sga。
  這部分沒有使用者資料儲存。sga也包括了程式間通訊資訊,例如鎖資訊。
  
  如果系統使用共享服務結構,那麼請求和相應佇列和pga的一些內容都在sga中。
  參考:
   ."oracle例項簡介" 5.2
   ."程式全域性區概覽" 7.17
   ."排程請求和相應佇列" 8.16
  
 動態sga
  動態sga結構下,快取、共享池、大池和私有程式記憶體的大小可以在不關閉例項的情況下修改。
  
  動態sga允許oracle執行時設定虛擬記憶體使用的上限。oracle能夠控制啟動例項允許例項使用
  的記憶體不超過最大值(SGA_MAX_SIZE)。如果SGA_MAX_SIZE在初始化引數檔案中的值比所有元件
  在初始時指定的或預設的小,那麼初始化引數檔案將被忽略。
  
  大多數的系統效能選項中,sga應該佔用真實記憶體。如果不這樣,並且虛擬記憶體被用來部分儲存,
  那麼整個資料庫系統效能將會迅速下降,因為部分sga由作業系統分頁(磁碟讀寫)。sga的專用共享區
  的數量對效能也有影響。
  
  sga的大小由幾個初始化引數決定,主要:
  ---------------------------------------------------------------------
  引數        描述
  DB_CACHE_SIZE    標準快取塊的大小
  LOG_BUFFER     重做日誌快取的大小
  SHARD_POOL_SIZE   用來存放共享的sql和plsql的區的大小
  LARGE_POOL_SIZE   大池的大小,預設是0
  ---------------------------------------------------------------------
  例項的sga記憶體分配顯示在用企業管理器或者sql plus啟動例項時。你也可以使用sql plus的show
  命令檢視當前例項的sga。
  
  Dynamic SGA Granules
  使用動態sga,最小的分配單元叫做Granules。buffer cache,share pool,java pool和large pool
  分配和釋放sga空間都是以Granules為單元的。(。。)所有有關granule的資訊都儲存在相應的granule
  實體中。oracle維護每個granule實體狀態和型別。
  
  granule的大小由總的sga大小決定。在大多數平臺上,當總的sga大小小於128m時,一個granule的大小是4m。
  超過的話,就是16m。同時對平臺也有一些依賴性,比如32位的windowNT,當sga超過128m的時候,一個granule是8m。
  
  sga當前granule的大小可以在檢視 v$sga_dynamic_components檢視。所有的sga中動態組成部分使用相同的granule大小。
  
  -----------------------------------------------------------
  注意:如果你指定了一個granule大小的非倍數值,那麼oracle將會取
  趨近的一個值。例如:如果granule大小是4m,你制定SB_CACHE_SIZE
  為10m,那麼實際上會按照12m來分配。
  -----------------------------------------------------------
  
  
  
 資料庫快取(Database Buffer Cache)
  資料庫快取是sga的組成部分,儲存了從資料檔案讀取的資料塊的拷貝。所有當前連線例項的使用者程式
  共享的訪問資料庫快取。
  資料庫快取和共享sql快取是按照邏輯分割成許多集。這種多集的組織減少了多處理器的爭用問題。 
  資料庫快取組織
  緩衝區由兩個列表組織:寫列表和最近最少使用列表(LRU)。寫列表中有髒緩衝,裡面包含了被修改過
  但還沒有寫回磁碟的資料。LRU列表包括空閒快取,正在使用的快取,未寫回的髒快取。空閒快取中不包含
  有用的資料,可以使用。pinned buffers是正在被訪問的快取。
  
  當一個oracle程式訪問快取時候,程式將快取放入最近最久未使用列表的末尾。(。。)
  (原文:
   When an Oracle process accesses a buffer, the process moves the buffer to the most
   recently used (MRU) end of the LRUlist. Asmore buffers are continuallymoved to
   the MRU end of the LRU list, dirty buffers age toward the LRU end of the LRU list.
  )
  
  oracle使用者程式第一次請求某個特定的資料時,將在資料庫快取中查詢資料。如果程式在快取中已經查詢到(cache命中),
  將直接從記憶體中讀取資料。如果未找到(未命中),則訪問資料前,從磁碟中的資料檔案中拷貝資料庫到快取中。
  訪問資料時,cache命中比未命中速度更快。
  
  在讀取資料庫到快取中之前,程式必須先找到一個空閒緩衝區。程式查詢LRU列表,從最近最少使用列表的末尾開始。
  程式搜尋直到找到一塊空閒的緩衝或者有起始限制的緩衝(該句翻譯有問題)。
  
  如果使用者程式通過查詢LRU列表,找到一個髒快取,則將這個快取移動到寫列表(write list),並繼續搜尋。
  當程式搜素到一個空閒快取,則讀取從磁碟讀取資料塊到該快取中,並把改快取放到MRU 。(MRU end of the LRU list)
  
  如果oracle使用者程式查詢在開始限制的混村內沒有找到一塊空閒快取,程式將停止搜尋LRU列表並通知DBW0後臺程式
  寫髒快取到磁碟。
   參考:"Database Writer Process(DBWn)" 8-8,更多的關於DBWn程式的資訊。
   
  LRU演算法和全表掃描
  當使用者程式進行全表掃描時,它讀取表的塊到快取,並且將其放入LRU列表的末尾(而不是MRU的末尾)。
  這是因為全表掃描通常需要的只有簡捷,所以資料庫必須被快速的換出而在快取中留下最常用的塊。
  (This is because a fully scanned table usually is needed only briefly, so the blocks
   should be moved out quickly to leave more frequently used blocks in the cache.)
  
  (。。)
  
  快取(buffer cache)大小
  oracle在一個資料庫中支援多個塊大小值。系統表空間使用預設的塊大小值。通過修改配置檔案的
  DB_BLOCK_SIZE引數,可以設定標準的塊大小。允許的值範圍是2k至32k。
  同時可以有選擇的設定兩個額外的緩衝池:keep和recycle,設定DB_KEEP_CACHE_SIZE和DB_RECYCLE_CACHE_SIZE。
  這三個引數各自相互獨立。
   參考:"Multiple Buffer Pools"
  非標準的塊大小設定的引數如下:
   DB_2K_CACHE_SIZE 
   DB_4K_CACHE_SIZE
   DB_8K_CACHE_SIZE
   DB_16K_CACHE_SIZE
   DB_32K_CACHE_SIZE
  每個引數設定了快取的相應的塊大小。
   ----------------------------------------------------------------------------
   注意:塊的最大值與平臺相關,一些值可能在某些平臺上不被允許。
   ----------------------------------------------------------------------------
  塊和緩衝大小設定舉例:
   DB_BLOCK_SIZE=4096
   DB_CACHE_SIZE=1024M
   DB_2K_CACHE_SIZE=256M
   DB_8K_CACHE_SIZE=512M
  例項中,DB_BLOCK_SIZE設定標準塊大小為4k。標準塊的緩衝區大小為1024m。同時,2k和8k的快取設定
  分別設定為256m和512m。
   ----------------------------------------------------------------------------
   注意:引數DB_nK_CACHE_SIZE不能被用來設定標準塊大小。也就是說,如果DB_BLOCK_SIZE
   是nK,那麼不能設定db_nk_block_size。標準塊大小總是由DB_CACHE_SIZE決定。
   ----------------------------------------------------------------------------
  cache大小是有限制的,所以並不是磁碟上所有資料都能匹配cache。當cache滿時,頻繁的cache未命中
  會導致oracle將cache中的髒資料寫回磁碟,以騰出空間給新的資料。(如果一個buffe不是髒的,那麼
  在新資料庫讀入buffer之前它不會被寫回磁碟。)
  頻繁訪問已經寫回磁碟的資料將會增加cache丟失(cache命中率降低)。
  
  cache的大小影響了請求資料結果的cache命中。如果cache較大,那麼通常會存放更多需要的資料。
  增大cache的大小增加了請求資料結果的命中的百分比。
  可以在不用關閉資料庫的前提下,改變執行中例項的cache大小。可以使用ALTER SYSTEM命令來操作。
  更多的資訊,檢視"Control of the SGA's Use of Memory" 7-16
  
  使用固定檢視(fixed view:資料字典檢視,存在與system表空間)v$buffer_pool來跟蹤不同的cache
  和重設大小的操作。
   參考:Oracle9i Database Performance Tuning Guide and Reference for information about tuning
      the buffer cache.
  
  Multiple Buffer Pools

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16179598/viewspace-612326/,如需轉載,請註明出處,否則將追究法律責任。

相關文章