也就是說,臟緩存塊存儲的是已經被修改過的,但是還沒有寫入到數據庫文件的信息。當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應用服務器跟數據庫服務器部署在一臺服務器上。但是,不能再跟郵件服務器等應用服務器放在一起。這會影響數據高速緩存的管理效率,從而最終影響數據庫的運行效能,F在服務器價格逐漸下滑,服務器的成本已經不是影響企業數據庫應用的關鍵。所以,出于數據庫性能考慮,筆者認為,企業在這上面還是應該大方的進行投資。沒必要為了這么一點點錢,影響到數據庫的性能。
文章來源于領測軟件測試網 http://www.kjueaiud.com/