oracle資料庫的快取技術

來源:互聯網
上載者:User

第一次接觸oracle資料庫,覺得他較其他的資料庫有很多優越性,特別在運行速度上,我曾試過在Linux下oracle10g的操作,速度要比在windows下提高4倍有餘。oracle靠什麼能達到這樣的效果呢?前兩天看了份“展示Oracle資料庫提供高效能運算的秘密”資料,現轉載下來與大家分享:

Oracle資料庫作為複雜運算的首選資料庫,其首先是通過所謂的資料快取來實現對資料的高速運算與操作的。 

資料快取跟作業系統的緩衝類似,其儲存最近從資料檔案中讀取的資料區塊,其中的資料可以被所有的使用者所訪問。如當我們利用Select語句從資料庫中查詢員工資訊的時候,其首先不是從資料檔案中去查詢這個資料,而是從資料快取中去尋找,而沒有這個必要再去查詢磁碟中的資料檔案了。只有在資料緩衝中沒有這個資料的時候,資料庫才會從資料檔案中去查詢。Oracle資料庫為什麼要如此設計呢?這是由於資料庫在讀取資料的時候,讀取記憶體的速度比讀取磁碟的速度要快很多倍,所以這種機制可以提高資料的整體訪問效率。   雖然其他資料庫也有這方面的設計,但是,相對來說,Oracle資料庫比其他資料庫,在這方面有更加出色的表現。難怪Oracle資料庫在記憶體的要求上,比其他資料庫要高。若以稍微的代價犧牲一些記憶體,而換取更高的資料訪問效能。筆者認為還是值得的。下面我們就來看看,Oracle資料庫在資料快取上有哪些特殊的表現。 

一、 空閑緩衝塊。 

當我們重新啟動資料庫後,系統就會為資料庫分配一些閒置緩衝塊。空閑緩衝塊中是沒有任何資料的,他在那邊默默的等著別寫入記錄。當Oracle 資料庫從資料檔案中讀取資料後,資料庫就會尋找是否有閒置緩衝塊,以便將資料寫入其中。   一般來說,資料庫在啟動的時候,就會在記憶體中預先分配這些緩衝塊。所以,Oracle資料庫在啟動的時候,會佔用比較多的記憶體。但是,這可以免去在實際需要時向記憶體申請的時間。所以,有時候Oracle資料庫雖然已啟動,記憶體的佔用率就很高,但是,其後續仍然可以正常啟動並執行原因。而其他資料庫雖然剛啟動的時候記憶體佔用率不是很高,但是,但系統記憶體到達80%以上時,在進行資料處理就會受到明顯的影響。   所以,當我們利用SELECT語句從資料庫檔案中讀取檔案的時候,資料庫首先會尋找是否有閒置緩衝。 

二、 命中緩衝塊。 

當SELECT語句先從資料庫檔案中讀取資料後,會把取得的資料放入到這個命中緩衝塊中。也就是說,當我們利用查詢語句從資料庫查詢處員工資訊後,這個資訊就會被儲存在快取中。直道快取消耗完畢等原因,這個空間才會被釋放。如此的話,下次使用者在查詢員工資訊的時候,就不需要從資料庫檔案中重新查詢相關資訊,而直接從資料快取中提取資料,從而提高資料庫的訪問效率。   另外要注意的一個問題是,命中緩衝塊中的資料不會被寫入資料檔案。確實,這個命中緩衝塊中的資料沒有被更改,其當然也不會被寫入資料庫檔案中。 

 三、 髒緩衝塊。 

當我們利用SELECT查詢語句把員工資訊的資料查詢出來後,資料庫會把這個資料所儲存的空緩衝塊做標記,表示該緩衝塊已經存有資料,使命中緩衝塊。此時,我們若在利用資料更新語句UPDATE對其中某條記錄進行更新時,如要把張三的名字改為張四。運行UPDATE語句後,資料庫也首先從快取中尋找是否有這條記錄,若存在這條記錄的話,就直接更改這條記錄,並且把該緩衝塊標記為贓緩衝塊。如此的話,就可以保持資料的一致性。   也就是說,髒緩衝Block Storage的是已經被修改過的,但是還沒有寫入到資料庫檔案的資訊。當SQL的UPDATE等資料更新語句對某個緩衝塊中的資料變更之後,這個命中緩衝塊就會被資料庫標記為髒緩衝塊。當滿足一定的條件時,這些髒緩衝塊中的資料內容會被寫入到資料庫檔案中去,以便永久性的保留資料庫修改記錄。   當系統中沒有空閑緩衝塊,而使用者又需要查詢資料時,資料庫就查詢當前所有的髒緩衝塊,把最先更改的髒緩衝塊中的內容先寫入資料庫檔案中,以便釋放這個髒緩衝塊。資料庫就又會把這個髒緩衝塊標記為空白閑緩衝塊,以方便使用者下次存入資料。 

那Oracle資料庫到底是通過什麼手段,來控制空閑緩衝塊、命中緩衝塊、髒緩衝塊之間的相互轉換的呢?說出來也許你不相信,Oracle資料庫就是通過兩張表,來管理這麼複雜的功能。這兩張表分別是DIRTY列表與LRU列表。   其中LRU列表儲存著所有空閑緩衝塊、命中緩衝塊已經還沒有被移入到DIRTY列表中的髒緩衝塊。當Oracle資料庫使用者在查詢資料的時候,可能會遇到如下情況:

1、當使用者尋找員工資訊時,資料庫首先在LRU列表中查詢是否有空閑緩衝塊。其查詢的資料是從尾部開始尋找。當尋找有閒置緩衝塊時,資料庫就會把查到的資料寫入到這個空閑緩衝中。 

2、若資料庫在查詢的時候,首先查到的是髒緩衝的話,則會把這個髒緩衝移動到DIRTY列表中,然後再繼續查詢,直到查詢到合適的空閑緩衝塊為止。 

3、若資料庫在LRU列表中,從尾到頭查了一遍,沒有找到空閑緩衝塊,或者雖然有空閑緩衝塊,但是其容量不符合要求時,資料庫就會暫時結束這一次尋找。然後,系統就會觸發資料庫寫進程,把DIRTY列表中的髒緩衝塊寫入到資料庫中去。已經被寫入到資料庫檔案中去的髒緩衝塊將又被資料庫標記為空白閑緩衝塊,並插入到LRU列表中。當資料庫執行完畢這個動作之後,資料庫又會對LRU列表進行搜尋,找到合適的資料高速空閑緩衝之後,就會把讀取的資料寫入到這個空閑緩衝中。

所以,我們在利用資料庫的時候,會發現有時候讀取大量資料的時候,速度會比較慢。除了其他原因外,也有一部份原因是因為資料庫沒有查到足夠大的空閑緩衝在存放這些資料,故只好寫進行讀寫操作,以釋放更多的髒緩衝,然後再進行查詢操作。 

知道了這些資料庫快取工作原理之後,我們資料庫管理員又該做些什麼呢,來對Oracle資料庫進行最佳化。為此,筆者有以下建議:

 1、為Oracle資料庫配置盡量大的記憶體。Oracle資料庫最新版本,根據官方的建議,其記憶體需要1G。雖然在低於這個記憶體數量的時候,資料庫仍然可以運行,但是,其運行適度會大打折扣。當查詢大量資料的時候,更是比較吃力。筆者現在使用的資料庫伺服器,是使用了4個G的記憶體。以前我用的是2個G的。記憶體升級後,探索資料庫的效能得到了比較大的改善。 

2、在對資料進行查詢操作時,盡量使用限制條件。如現在需要查詢銷售部門的員工資訊時,我們不需要查詢全部的員工資訊,而是在SELECT語句中,利用WHERE條件陳述式設定查詢條件。如此的話,就可以充分利用DIRTY列表中的空閑緩衝塊,而不會因為空白閑緩衝塊容量不夠而頻繁的去執行資料庫寫操作。這會明顯降低資料庫的運行操作。同時,在查詢時,最好也能夠明確查詢的資訊,如你只需要員工的姓名與入職日期,那就不需要把員工的出生年月、社會安全號碼碼都查詢出來。所以,有時候合理設計檢視,也可以提高資料庫的運行效率。 

3、最好不要在資料庫伺服器上運行其他的服務。在資料庫伺服器中,若還運行其它伺服器的話,除了硬體資源爭奪影響伺服器的運行效率之外,還會產生一個問題。就是會使得資料庫的資料快取塊不連續。這會直接影響資料庫查詢空閑緩衝塊的效率。對髒緩衝塊進行資料庫寫入操作以及資料庫進行標記之間的轉換也會產生影響。所以,根據筆者的經驗,資料庫伺服器最好能夠獨立。最多隻能跟其對應的應用伺服器部署在同一台伺服器上。如現在Oracle資料庫是一台ERP系統的後台資料庫,最好資料庫能夠跟ERP伺服器分開部署。但是,若由於伺服器資金的限制,那麼可以把ERP應用伺服器跟資料庫伺服器部署在一台伺服器上。但是,不能再跟郵件伺服器等應用伺服器放在一起。這會影響資料快取的管理效率,從而最終影響資料庫的運行效能。現在伺服器價格逐漸下滑,伺服器的成本已經不是影響企業資料庫應用的關鍵。所以,出於資料庫效能考慮,筆者認為,企業在這上面還是應該大方的進行投資。沒必要為了這麼一點點錢,影響到資料庫的效能

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.