達夢資料庫基礎知識(三)達夢資料庫記憶體結構

winderen111發表於2021-10-26

資料庫管理系統是一種對記憶體申請和釋放操作頻率很高的軟體,如果每次對記憶體的使用

都使用作業系統函式來申請和釋放效率會比較低,加入自己的記憶體管理是DBMS系統所必

須的。通常記憶體管理系統會帶來以下好處:

  (1)申請、釋放記憶體效率更高;

  (2)能夠有效地瞭解記憶體的使用情況;

  (3)易於發現記憶體洩露和記憶體寫越界的問題。

達夢資料庫管理系統的記憶體結構 主要 包括記憶體池、緩衝區、排序區、雜湊區 等 。根據系統中子模組的不同功能,對記憶體進行了上述劃分,並採用了不同的管理模式。

 

1、記憶體池

達夢資料庫例項的記憶體池包括共享記憶體池和其他一些執行時記憶體池。動態檢視

V$MEM_POOL 詳細記錄了當前系統中所有的記憶體池的狀態,可透過查詢這個

動態檢視掌握例項的記憶體使用情況。

1)共享記憶體池

共享記憶體池是資料庫例項在啟動時從作業系統申請的一大片記憶體。在資料庫例項的執行期間,經常會申請與釋放小片記憶體,而直接向作業系統申請和釋放記憶體時需要發出系統呼叫,此時可能會引起執行緒切換,降低系統執行效率。於是達夢資料庫採用採用共享記憶體池的方式 一次向作業系統申請一片較大記憶體,作為共享記憶體池。當系統在執行過程中需要申請小片 記憶體時,可在共享記憶體池內進行申請,當用完該記憶體時,再釋放掉,即歸還給共享記憶體池。

資料庫管理員可以透過資料庫的配置檔案( dm. ini )來對共享記憶體池的大小進行設定, 共享池大小的引數為MEMORY_POOL預設大小為500M。如果在執行時所需記憶體大於配置值,共享記憶體池也可進行自動擴充套件,INI引數MEMORY_EXTENT_SIZE指定了共享記憶體池每次擴充套件的大小,引數MEMORY_TARGET則指定了共享記憶體池 擴充套件到超過該值後,空閒時會 收縮到的大小。

2)執行時的記憶體池

除了共享記憶體池,達夢資料庫的一些功能模組在執行時還會使用自己的執行時記憶體池。這些執行時記憶體池是從作業系統申請一片記憶體作為本功能模組的記憶體池來使用,如會話記憶體池、虛擬機器記憶體池等。

 

2、緩衝區

1)資料緩衝區

資料緩衝區是資料庫在將資料頁寫入磁碟之前以及從磁碟上讀取資料頁之後,資料頁所儲存的地方。這是資料庫至關重要的記憶體區域之一,將其設定得太小,會導致緩衝頁命中率低,磁碟IO頻繁;將其設定得太大,又會導致作業系統記憶體本身不夠用。

資料庫例項啟動時,首先根據配置的資料緩衝區大小向作業系統申請一片連續記憶體並將其按資料頁大小進行格式化,並置入“自由”鏈中。資料緩衝區存在三條鏈來管理被緩衝的資料頁,一條是“自由”鏈,用於存放目前尚未使用的記憶體資料頁,一條是“LRU”鏈,用於存放已被使用的記憶體資料頁(包括未修改和已修改),還有一條即為“髒”鏈,用於存放已被修改過的記憶體資料頁。

LRU鏈對系統當前使用的頁按其最近是否被使用的順序進行了排序。這樣當資料緩衝區中的自由鏈被用完時,從LRU鏈中淘汰部分最近未使用的資料頁,能夠較大程度地保證被淘汰的資料頁在最近不會被用到,減少IO。

在系統執行過程中,通常存在一部分“非常熱”(反覆被訪問)的資料頁,將它們一直留在緩衝區中,對系統效能會有好處。對於這部分資料頁,資料緩衝區開闢了一個特定的區域用於存放它們,以保證這些頁不參與一般的淘汰機制,可以一直留在資料緩衝區中。

 

(1) 類別

達夢資料庫中有四種型別的資料緩衝區,分別是NORMAL、KEEP、FAST和RECYCLE。其中,使用者可以在建立表空間或修改表空間時,指定表空間屬於NORMAL或KEEP緩衝區。RECYCLE緩衝區供臨時表空間使用,FAST緩衝區根據使用者指定的FAST_POOL_PAGES大小由系統自動進行管理,使用者不能指定使用RECYCLE和FAST緩衝區的表或表空間。

NORMAL緩衝區主要是提供給系統處理的一些資料頁,沒有特定指定緩衝區的情況下,預設緩衝區為NORMAL;KEEP的特性是對緩衝區中的資料頁很少或幾乎不怎麼淘汰出去,主要針對使用者的應用是否需要經常處在記憶體當中,如果是這種情況,可以指定緩衝區為KEEP。

資料庫提供了可以更改這些緩衝區大小的引數,使用者可以根據自己應用需求情況,指定dm.ini檔案中BUFFER(1000MB)、KEEP(8MB)、RECYCLE(300MB)、FAST_POOL_PAGES(3000)值(括號中為預設值),這些值分別對應是NORMAL緩衝區大小、KEEP緩衝區大小、RECYCLE緩衝區大小、FAST緩衝區資料頁總數。

 

(2) 讀多頁

在需要進行大量I/O的應用當中,達夢之前版本的策略是每次只讀取一頁。如果知道使用者需要讀取表的大量資料,當讀取到第一頁時,可以猜測使用者可能需要讀取這頁的下一頁,在這種情況下,一次性讀取多頁就可以減少I/O次數,從而提高了資料的查詢、修改效率。

資料庫提供了可以讀取多頁的引數,使用者可以指定這些引數來調整資料庫執行效率的最佳狀態。在資料庫配置檔案dm.ini中,可以指定引數MULTI_PAGE_GET_NUM大小(預設值為1頁),來控制每次讀取的頁數。

如果使用者沒有設定較適合的引數MULTI_PAGE_GET_NUM值大小,有時可能會給使用者帶來更差的效果。如果MULTI_PAGE_GET_NUM太大,每次讀取的頁可能大多都不是以後所用到的資料頁,這樣不僅會增加I/O的讀取,而且每次都會做一些無用的I/O,所以系統管理員需要衡量好自己應用需求,給出最佳方案。

 

3)      日誌緩衝區

日誌緩衝區是用於存放重做日誌的記憶體緩衝區。為了避免由於直接的磁碟IO而使系統效能受到影響,系統在執行過程中產生的日誌並不會立即被寫入磁碟,而是和資料頁一樣,先將其放置到日誌緩衝區中。那麼為何不在資料緩衝區中快取重做日誌而要單獨設立日誌緩衝區呢?主要是基於以下原因:

(1)重做日誌的格式同資料頁完全不一樣,無法進行統一管理;

(2)重做日誌具備連續寫的特點;

(3)在邏輯上,寫重做日誌比資料頁IO優先順序更高。

資料庫提供了引數RLOG_BUF_SIZE對日誌緩衝區大小進行控制,日誌緩衝區所佔用的記憶體是從共享記憶體池中申請的,單位為頁數量,且大小必須為2的N次方,否則採用系統預設大小1024頁。

 

4)字典緩衝區

字典緩衝區主要儲存一些資料字典資訊,如模式資訊、表資訊、列資訊、觸發器資訊等。每次對資料庫的操作都會涉及到資料字典資訊,訪問資料字典資訊的效率直接影響到相應的操作效率,如進行查詢語句,就需要相應的表資訊、列資訊等,這些字典資訊如果都在緩衝區裡,則直接從緩衝區中獲取即可,否則需要I/O才能讀取到這些資訊。

DM8採用的是將部分資料字典資訊載入到緩衝區中,並採用LRU演算法進行字典資訊的控制。緩衝區大小設定問題,如果太大,會浪費寶貴的記憶體空間,如果太小,可能會頻繁的進行淘汰,該緩衝區配置引數為DICT_BUF_SIZE,預設的配置大小為50M。

DM8採用緩衝部分字典物件,那會影響效率嗎?資料字典資訊訪問存在熱點現像,並不是所有的字典資訊都會被頻繁的訪問,所以按需載入字典資訊並不會影響到實際的執行效率。但是如果在實際應用中涉及對分割槽數較多的水平分割槽表訪問,例如上千個分割槽,那麼就需要適當調大DICT_BUF_SIZE引數值。

 

5)SQL緩衝區

SQL緩衝區提供在執行SQL語句過程中所需要的記憶體,包括計劃、SQL語句和結果集快取。很多應用當中都存在反覆執行相同SQL語句的情況,此時可以使用緩衝區儲存這些語句和它們的執行計劃,這就是計劃重用。這樣帶來的好處是加快了SQL語句執行效率,但同時給記憶體也增加了壓力。

 

6)排序區

排序緩衝區提供資料排序所需要的記憶體空間。當使用者執行SQL語句時,常常需要進行排序,所使用的記憶體就是排序緩衝區提供的。在每次排序過程中,都首先申請記憶體,排序結束後再釋放記憶體。

資料庫提供了引數來指定排序緩衝區的大小,引數SORT_BUF_SIZE在DM配置檔案dm.ini中,系統管理員可以設定其大小以滿足需求,由於該值是由系統內部排序演算法和排序資料結構決定,建議使用預設值20M。

 

7)雜湊區

DM8提供了為雜湊連線而設定的緩衝區,不過該緩衝區是個虛擬緩衝區。之所以說是虛擬緩衝,是因為系統沒有真正建立特定屬於雜湊緩衝區的記憶體,而是在進行雜湊連線時,對排序的資料量進行了計算。如果計算出的資料量大小超過了雜湊緩衝區的大小,則使用DM8創新的外存雜湊方式;如果沒有超過雜湊緩衝區的大小,實際上還是使用記憶體池來進行雜湊操作。


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

相關文章