DB2數(shù)據(jù)庫表“合理”映射到表空間的5個規(guī)則
我們今天主要向大家講述的是將DB2數(shù)據(jù)庫表“合理”映射到表空間的一些規(guī)則的描述,在DB2數(shù)據(jù)庫中,是按照表、以及表空間與數(shù)據(jù)庫,這3個級別來存儲數(shù)據(jù)的。由于表空間的設置直接跟數(shù)據(jù)庫的性能相關。
為此在表空間中數(shù)據(jù)表的部署是否合理就直接影響到數(shù)據(jù)庫的運行效率。在DB2數(shù)據(jù)庫中,是按照DB2數(shù)據(jù)庫表、表空間、數(shù)據(jù)庫三個級別來存儲數(shù)據(jù)的。由于表空間的設置直接跟數(shù)據(jù)庫的性能相關。為此在表空間中數(shù)據(jù)表的部署是否合理就直接影響到數(shù)據(jù)庫的運行效率。筆者認為,如果要讓數(shù)據(jù)表合理的映射到表空間,至少需要遵守如下的規(guī)則。
規(guī)則一:根據(jù)表的訪問率來映射表空間。
在一個數(shù)據(jù)庫系統(tǒng)中,表的訪問率是不同的。根據(jù)不完全的預測,一個數(shù)據(jù)庫中大概只有40%到50%左右的表其具有比較高的訪問率。而其他的數(shù)據(jù)表很難的才用到一回。如在一個為ERP而設計的數(shù)據(jù)庫系統(tǒng)中,采購訂單、銷售訂單等對應的數(shù)據(jù)表訪問率是很高的,但是成本調整單等對應的數(shù)據(jù)表一年到頭難得使用幾次。
所以在數(shù)據(jù)庫部署中,數(shù)據(jù)庫管理員首先要根據(jù)企業(yè)應用的實際情況,將數(shù)據(jù)庫中的表按照其使用的頻率進行分類。然后將使用頻率高的表放在一個表空間,或者根據(jù)模塊放在幾個不同的表空間中。然后將他們存放在性能比較高的硬盤上,或者存放在活躍程度低的硬盤中。如此的話,I/O爭用的現(xiàn)象就會少的多,從而提高數(shù)據(jù)庫的性能。
規(guī)則二:根據(jù)字段的使用程度來規(guī)劃表。
不僅不同的表訪問頻率有很大的差別,即使是同一個DB2數(shù)據(jù)庫表中,其字段的訪問頻率也會有很大不同。如在一些人事管理系統(tǒng)數(shù)據(jù)庫中,有些公司會將員工的身份證復印件或者照片掃描存放到數(shù)據(jù)庫中。這些圖片在數(shù)據(jù)庫中需要利用LOB數(shù)據(jù)類型來存放。由于這個數(shù)據(jù)類型比較大,為此無論是在查詢還是數(shù)據(jù)庫備份的時候,都會給其帶來負面的影響。
如當用戶在查詢員工信息時,如果在SELECT語句中不加入字段的名稱,而采用全部查詢的方式,那么查詢的速度會很慢。隨著圖片數(shù)量的增多,其速度會呈幾何級別下降。但是實際上,用戶平時并不需要訪問這些員工的身份證復印件或者照片信息。所以在查詢的時候,將這些沒有的信息給他們顯示出來,也是一種浪費,而且還影響數(shù)據(jù)庫的性能。
為此在設計表的時候,如果某些列不經(jīng)常用到,而且這些列的數(shù)據(jù)類型又是大數(shù)據(jù)類型或者說很多都是NULL值(數(shù)據(jù)庫在處理NULL值的時候效率要比其他的只慢許多),此時最好將這些列跟其它的列分開在不同的表中存放。由于他們的訪問頻率不同,就可以按照上面第一個規(guī)則來映射表空間,以提高數(shù)據(jù)庫的訪問性能。
不過需要注意的是,如果身份證復印件等信息經(jīng)常需要用到的,那么也最好將他們分開在兩個表中。只是將存放復印件信息的表也存放在性能比較好的硬盤中,以提高訪問這些數(shù)據(jù)的效率。之所以仍然需要將他們分開存放,這主要是考慮到備份的性能。因為這些LOB數(shù)據(jù)類型會降低數(shù)據(jù)庫的備份效率,為此可以在數(shù)據(jù)庫比較空閑的時候對這些LOB數(shù)據(jù)所在的表空間進行獨立的備份。
規(guī)則三:索引數(shù)據(jù)、長字段數(shù)據(jù)、普通數(shù)據(jù)分開存放。
筆者在進行表空間設計的時候,往往會將索引數(shù)據(jù)、長字段數(shù)據(jù)與普通數(shù)據(jù)分開來存放。即將一個表空間用來存放索引數(shù)據(jù),一個表空間用來存儲長字段數(shù)據(jù),另一個表空間庸才存儲普通的數(shù)據(jù)。這主要是通過在建立表的時候為這些數(shù)據(jù)類型建立不同的DB2數(shù)據(jù)庫表,然后將表根據(jù)數(shù)據(jù)類型分類的不同將他們存放在不同的表空間中。
這主要是根據(jù)三種數(shù)據(jù)的作用不同而考慮的。眾所周知,給表設置索引之后可以在很大程度上提高數(shù)據(jù)庫的性能。這主要是因為如果設置索引好,數(shù)據(jù)庫系統(tǒng)會先從索引找查找數(shù)據(jù)。查找相應的數(shù)據(jù)后會直接根據(jù)記錄序列號從其他表中讀取相關記錄。也即是說只在索引表中查詢,而不會在其他表中查找記錄。
所以說如果能夠提高索引表的工作效率,那么就可以在很大程度上提高數(shù)據(jù)庫的查詢性能。為此筆者建議,將索引數(shù)據(jù)存放在單獨的表空間中。如果硬件條件允許的話,并且企業(yè)對于查詢具有比較高的性能要求,就將索引表空間存放在單獨的硬盤中,以防止硬盤的I/O爭用。如果硬件條件不允許的話,那么至少也要將這個索引表空間存放在性能比較高的硬盤上。
另外為了提高索引的工作效率,最好不講在長字段上添加索引。如對于文本型的字段,雖然也可以為其添加索引。但是給其添加索引的話,工作效率并不會很高。此時將這個索引數(shù)據(jù)存放在單獨的表空間中,這個表空間就會變得很大。根據(jù)筆者這么多年的工作經(jīng)驗,可以告訴大家,在長字段上設置索引,是得不償失的。
將長字段分開來存放,還有一個原因就是節(jié)省存儲空間。根據(jù)使用的經(jīng)驗,長字段的使用效率是比較低的。也就是說,在長字段數(shù)據(jù)類型中,一定會存在沒有使用的空間。所以會有一定程度的浪費。具體的浪費數(shù)量要根據(jù)長字段的數(shù)據(jù)類型大小以及在列中出現(xiàn)的數(shù)據(jù)的大小是否相對一致。
因為長字段數(shù)據(jù)會被系統(tǒng)盡可能的平均分配到頁面中。而長字段數(shù)據(jù)的最后頁面往往不能夠占滿其規(guī)定的字節(jié),為此對于長字段來說,存儲空間的浪費是不可避免的。故最好是將他們存放在不同的表中。這并不是說可以避免空間的浪費,而是指在有需要的時候可以更加方便的回收這些被浪費的空間。
規(guī)則四:根據(jù)備份的需要來規(guī)劃表空間。
當數(shù)據(jù)庫中的數(shù)據(jù)量比較多的時候,對數(shù)據(jù)庫進行備份是一項比價花時間的工作。為此對于大型的數(shù)據(jù)庫,管理員往往不會對整個數(shù)據(jù)庫進行備份。而是在表空間的級別上,進行單獨的備份。如此的話,就可以將數(shù)據(jù)庫備份的時間分開來,從而可以有效減少對數(shù)據(jù)庫正常作業(yè)產(chǎn)生的負面影響。
如以前有個客戶,他們的業(yè)務非常的頻繁,為此每天的數(shù)據(jù)都會有很大的增長。為了提高他們數(shù)據(jù)庫性能,筆者決定采用在表空間級別上進行備份的策略。根據(jù)數(shù)據(jù)庫繁忙程度的不同,分別在中午午休時間與晚上下班時間進行數(shù)據(jù)庫的備份作業(yè)。
這家企業(yè)數(shù)據(jù)庫的空閑時間不讀,只有中午一個小時與晚上二個小時的空閑時間。而根據(jù)預測,要完成海量數(shù)據(jù)庫的備份,起碼需要150分鐘的時間。所以在空間時間內(nèi)無法完成整個數(shù)據(jù)庫的備份。為此筆者只好在DB2數(shù)據(jù)庫表空間級別上進行備份,即將整個數(shù)據(jù)庫的備份工作分散在這三個小時內(nèi)完成。從而將數(shù)據(jù)庫備份對服務器產(chǎn)生的性能影響降低到最低。
規(guī)則五:根據(jù)表的大小來規(guī)劃表空間。
在整個數(shù)據(jù)庫中,表的大小往往會有很大的差異。有些表可能只有不到幾百條記錄;而有些表則往往有上百萬、上千萬條記錄。根據(jù)表記錄數(shù)量的不同,可以將表分為大表與小表。在規(guī)劃表空間的時候,這個就是需要考慮的一個因素。
如可以將一些小表存放在一個單獨的表空間中,并且是存放到SMS類型的表空間。因為對于小表來說,其I/O對于其性能的影響并不是很大。然后對那些大表,并且需要進行快速訪問的,就需要選擇合適的DMS表空間。這主要是因為對于大DB2數(shù)據(jù)庫表操作,往往會涉及到很多的輸入輸出,此時這個I/O往往會成為其性能的瓶頸。
可見,要將表映射到合適的表空間不是一件很容易的事情。這不僅要求數(shù)據(jù)庫管理員具有很深厚的技術功底,更重要的是要求他們有比較豐富的實際項目經(jīng)驗。有時候這個項目經(jīng)驗可能比固定的規(guī)則更加有用。所以希望數(shù)據(jù)庫管理在牢記上面這些規(guī)則的同時,要學會靈活應用。
而不能夠在平時的工作中死搬硬套。如對于一些比較小型的應用,以上這些規(guī)則根據(jù)其不到應有的效果。相反,在這表空間設計上反而浪費了很多時間。故一般在比較大型的數(shù)據(jù)庫應用中才需要通過表空間規(guī)劃來提升數(shù)據(jù)庫性能。