萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> oracle教程 >> 不讓鏈化現象影響數據庫性能

不讓鏈化現象影響數據庫性能

正常情況下往表中新建記錄時,數據庫系統會將數據寫入到塊並會像這行記錄提供一個ROWID值。這個值記錄了這條記錄在硬盤上存儲的位置。在更新某 條記錄的時候,也是如此。數據庫系統會根據ROWID的值將需要更新的記錄從硬盤中讀取到塊中;然後更新完畢後,再將塊中的記錄保存到硬盤對應的位置。更 新過程中,ROWID列的值通常情況下不會改變。

但是如果一個塊的容量不能夠容納一條記錄。也就是會所,當單個數據塊沒有足夠的空間來保存新建的一行記錄或者更新的某行記錄時,就會發生鏈化現象。 到一個數據庫的容量不足以容納一條記錄時,那麼數據庫就不得不動用更多的數據塊來保存這條記錄。在Oracle數據庫中,如果某條記錄需要利用多個數據庫 來保存,我們往往把這行記錄叫做鏈化行。而在訪問一行記錄時,如果需要訪問多個數據塊,則會比訪問單個數據塊需要耗費更多的服務器資源,會大大降低數據庫 性能。我們把這種因為鏈化行而導致的數據庫性能下降的現象叫做鏈化現象。根據專家統計,嚴重的話,鏈化現象可能降低數據庫10%的性能,甚至更多。所以數 據庫管理員如果在數據庫部署中,能夠有效避免鏈化現象,那麼就可以在很大程度上提升數據庫的性能

一、 如何判斷是否有鏈化現象的存在?

那麼數據庫管理員該如何判斷數據庫中是否有鏈化現象的存在呢?如果沒有工具,光憑數據庫管理員的眼力或者經驗的話,是很難判斷的。數據庫管理員必須 找一個順手的工具。其實Oracle數據庫設計這已經預計到這個問題對於數據庫性能的不利影響。為此在數據庫中已經提供了追蹤、分析鏈化現象的工具。在 Oracle數據庫安裝主目錄的/rdbms/admin下有一個腳本文件,名字叫做utlchain.sql。這是Oracle數據庫自帶的一個腳本文 件。我們可以利用文本編輯器等工具來打開這個腳本文件,可以看到這個腳本文件主要是用來創建一個表,用來保存分析腳本現象所需要的內容。

第一步:創建所需要的表。

首先,數據庫管理元需要執行Oracle數據庫提供的utlchain.sql腳本文件。這個文件位於Oracle主目錄下的/rdbms /admin下。這個腳本主要的用途就是建立一個表格。這個表格很有用。數據庫系統會把分析的結果保存到這個表中。默認情況下,這個表格在安裝數據庫時並 不會自動生成。如果數據庫管理員需要分析數據庫中是否存在鏈化現象,那麼就需要手工執行這個腳本文件,以建立這張表格。這張表格中,主要有表名、 HEAD_ROWID列等等。

第二步:分析目的表格。

創建上面的表格後,默認情況下裡面是沒有數據的。因為還沒有進行相關的分析。假設現在在數據庫中有一個Product的表格,主要用來保存產品信 息。現在數據庫管理員想要知道,數據庫系統在操作這張表格數據的時候,是否存在有鏈化現象。此時,數據庫管理員就需要利用下面的語句來進行分析查詢。

Analyze table product list chained rows;

上面這條語句的作用,就是會分析product這張表格。判斷這張表格中的記錄是否存在在不同的塊中。如果這個product表格中,有記錄存儲在 不同的塊中,則這條語句就會把相關的結果保存到剛才建立的表中。所以,如果數據庫管理員查詢剛才建立的表chained_rows,如果這個表中有相關記 錄的話,則就說明數據庫中存在鏈化現象。數據庫管理員需要采取相應的措施來避免這種情況。如果沒有的話最好。

不過在使用這個語句的時候,需要注意幾點。一是每次分析完治後,最好把這個表個中的記錄刪除。因為下次分析的時候,如果表中有記錄的話,系統不會自 動刪除。所以在分析另外一個表的時候,如果也有鏈化現象。那麼此時相關的記錄就會很多,數據庫管理員閱讀的時候會出現故障。二是這個分析的頻率最好頻繁一 點。當數據庫中的記錄比較多時或者數據更新比較頻繁的情況下,最好能夠每隔幾天就執行一下這個分析語句,以判斷是否有鏈化現象的存在。等到大量記錄或者表 格有鏈化現象的時候,處理起來就會比較困難了。所以對於大部分事務型的數據庫系統,數據庫管理員要養成一個周期性分析的習慣。對於大部分的數據庫優化作業 來說,事先追蹤遠遠比時候解決要重要的多。當問題出現後再去解決的話,往往會大費周章,有些即使采取有效的措施,也指能夠避免後續的操作不會出現這種情 況。要解決以前的記錄問題,只有重新導出、導入數據後才能夠徹底解決。顯然這會增加工作量與數據風險。為此筆者再不厭其煩的強調一次,對於這個鏈化現象的 追蹤分析,最好能夠每個星期執行一次。特殊情況下,還可以利用任務計劃,每天執行一次。盡早發現問題,並采取有效措施來避免這種情況。

二、 如何避免鏈化現象?

當數據庫發現有鏈化現象時,就需要及時調整相關設置,來避免這種情況。造成鏈化現象的主要原因是由於塊的大小設置不合適所造成的。如果一個數據塊的 大小不能夠容納一條記錄,那麼就容易造成鏈化現象。所以如果適當調整數據塊的大小,能夠在很大程度上避免這個鏈化現象。在Oracle數據庫中,為了有效 避免鏈化現象,可以通過調整參數PCTFREE來實現。這個參數的主要用途就是為更新一個塊所保留的空間。有時候系統默認的值往往不能夠滿足需求。為此需 要數據庫管理員根據實際需要設置合適的值。值得注意的是,這個值可以根據表來進行設置。為此如果數據庫管理員認為某張表的記錄可能比較長,需要占用比較大 的空間時,則可以針對這張表設置比較大的塊。

雖然通過調整PCTFREE參數可以有效避免鏈化現象。但是有時候表設計不當也是造成這個問題的主要原因之一。如有一張表M_PRODUCT表格, 用來存放產品信息。在這張表中,其產品信息主要分為成品與原材料兩類。其中原材料這類產品中,在系統中需要記錄詳細的產品規格信息,而且還需要同時記錄中 英文內容。所以光這個產品規格,中英文加起來最多的就有3000個左右的字符。而成品信息的話相對來說比較簡單。此時這個表中的記錄就存在著兩極分化的現 象。有些記錄的容量很大,需要利用多個數據塊來進行保存,就發生了鏈化現象。而有些記錄的話,容量不是很大。此時雖然可以通過給這個表設置比較大的數據塊 來解決這個鏈化現象;但是同時也會浪費數據空間。因為還有大部分記錄的話,根本用不到這麼大的塊空間。所以在這種情況下,片面調整PCTFREE參數,會 降低硬盤空間的利用率。此時,筆者認為最好能夠調整數據庫表格的設計。如可以將產品規格字段保存在另外一個表格中,然後通過關鍵字連接到Product表 格中。如此的話,在Product表格中,所有記錄的的長度都會差不多。此時再根據需要來調整PCTFREE參數,不僅可以有效避免鏈化現象,而且還同時 提高了硬盤空間的利用率。當然,對於新建立的表格,需要適當的提高PCTFREE參數,避免其出現鏈化現象。不過這個基表的調整,對於已經投入使用的數據 庫系統來說,調整的動作有點大,會影響用戶的正常使用。為此在數據庫設計的時候,就需要跟用戶充分的溝通。在數據庫初始化設計時,就能夠預見到這種情況。 所以筆者一直強調,數據庫優化一定要做在前。

另外,如果數據庫中的記錄很少更新,如一些決策分析系統或者數據倉庫,其只有在剛開始的時候需要大量的導入數據。導入數據後對數據庫中的內容基本上 不會再更新。此時不需要把PCTFREE參數設置的太大。可以設置比較小的值,能夠提高硬盤空間的利用率,讓表空間存儲更多的記錄。可見,PCTFREE 參數的大小沒有一個固定的參考標准。其主要根據數據庫的用途、表中記錄的更新程度、記錄的大小等等決定的。如何確定一個合理的PCTFREE參數值,以減 少鏈化現象同時提高表空間的利用率,這也正是數據庫優化的難點與挑戰所在。

copyright © 萬盛學電腦網 all rights reserved