Oracle數據庫性能:表占用盤區解析
眾所周知,表在Oracle數據庫中占有很重要的地位,另外,碎片對于Oracle數據庫空間管理有很大的阻礙作用。同時如果段中的盤區量比較多的話,也會影響到數據庫的性能。雖然說在 Oracle10G中采用了本地托管表空間技術,已經可以在最大程度上消除由此帶來的負面影響。但是當數據量一大,盤區量增加,仍然會降低數據庫的查詢效率。當數據庫管理員遇到類似的情況時,該如何處理呢?在這篇文章中,筆者主要針對這個問題做出一些說明,以供大家參考。
一、如何統計某個表所使用的盤區數量?
Oracle數據庫系統在分配磁盤空間的時候,往往采用的是逐筆分配的方法。如此長久以往,隨著表逐漸變大,其使用的盤區數量也會隨之增加。如果在部署數據庫的時候,不能夠合理的預見到表的增長情況,那么后續盤區數量就會非理性的增長。從而最終影響到數據庫性能。為此數據庫管理員必須要對數據庫的運行不間斷的進行追蹤,如需要統計一些常用表、記錄數量比較多的表的盤區數量。
如下圖所示,這是一個ERP系統中產品信息基本表的盤區情況。據筆者了解,這家公司數據庫才用來不滿六個月。此時產品表的盤區數量已經達到了 25。如果再過個半年,那么盤區數量就有可能突破100了。很明顯,在數據庫設計的時候,數據庫管理員沒有預料到這種情況。如果任其發展下去,其很可能會成為系統性能的瓶頸。故有必要對其進行整理。
二、創建新表空間并將相關數據移植進去。
當數據庫管理員發現表所占用的盤區數量非常大已經成了不爭的事實時,需要設法對表進行整理。一般比較推薦的做法是創建一個新的表空間,然后將相關的數據再移植進去。在談具體的操作之前,筆者要強調一點。雖然數據庫允許這個事后的彌補措施,但是筆者并不建議經常這么操作。筆者的意見是在數據庫設計的時候,就最好能夠遇見到表日后的增長情況。如果某個表的記錄比較多、更新比較頻繁、使用也比較多的話,那么最好能夠為其設置一個比較獨立的表空間或者比較高的增長率。這些措施都可以在最大程度上降低日后表所占用的盤區數目,提高表的查詢效率。
第一步:創建一個新的表空間并創建一個M_PRODUCT1表。
注意筆者并不建議在已有的表空間中建立表。這主要是因為已有的表空間中其可能已經沒有連續的存儲空間了。為此不能夠確保新創建的表格一定具有連續的磁盤空間。筆者認為,最好能夠再重新創建一個新的表空間。而且由于這張表更新頻率比較快、使用頻率也比較高,為此專門設置一個表空間有利于后續的維護,如數據的升級、備份等等。另外需要注意的是,要為這個表空間設置一個合適的大小。一般來說,最好這個大小能夠滿足未來兩年的需要。這可以滿足未來數據增長的需要。否則的話,如果每隔半年或者一年就遇到盤區數量過多的問題,那顯然會很頭疼。
表空間創建完成之后,再建立一張M_PRODUCT1表。在創建這個表的時候,數據庫管理員可以采用Create as Select * FROM M_PRODUCT的形式來創建表。在創建表的同時,將數據也導入到新表中,從而確保數據與數據類型的一致。
第二步:刪除原表與表中的索引。
主要要先將原表中的索引一一刪除,然后才能夠刪除表。否則的話,系統會提示錯誤信息。為了保障數據的安全,筆者強調一次,在操作之前最好先對整個數據庫進行一次完全備份。其次由于這會影響到系統的正常運行,為此在操作之前最好先斷開當前的所有用戶。并設置為用戶不能夠訪問。以免在操作的過程中,造成不必要的麻煩。一般建議在用戶不使用數據庫的時候,如下班后或者雙休日對其進行操作。
第三步:重命名新表并建立索引。
將原先的表刪除之后,再將剛才新建的表格名字改成原來的表名。然后根據原先的表建立相關的索引。這里比較簡便的方法是,在創建新表的時候就將索引也復制過去。不過索引的名字不能夠重復,為此需要在原有的索引名字后面加入一個后綴。等到舊表刪除之后,再將索引的名字改回來,并重新啟用。注意,如果表中的數據比較多的話,則這個重新創建索引的時間可能會比較長。
最后筆者提醒一點,如果客戶表增長過快,可以將數據移植到一個有著更大的統一盤區大小的表空間里,以適應后續表的增長。當然這是一項比較大的工程。雖然這需要重建相關表的索引,但是這能夠保證這個表不會從數據庫物理存儲中丟失。如果數據庫管理員覺得有這么操作的必要,則筆者可以提供一些加快操作的建議。如可以使用COPY命令來避免使用回滾段。或者說使用Nologging選項來避免重做導致的時間問題。當記錄比較多時,使用NOLOGGING 選賢能夠加速數據插入的速度。不過其也同時帶來一個缺陷,即當出現問題時不能夠進行回滾操作。魚與熊掌不能夠兼得,最后數據庫管理員還是要在性能與安全之間進行均衡。
通過以上這種方式來解決盤區過多的問題,只能是不得已而為之的事情。最關鍵的還是要在數據庫設計階段,就對表的增長進行合理的預計。然后根據預計的結果對盤區空間以及表空間進行合理的規劃。合理的規劃可以將盤區數量控制在比較小的范圍之內。
關于Oracle數據庫中表占用盤區的講解就為大家介紹這么多,希望大家通過上文的學習之后都能夠從上文中涉及到的內容中有所收獲。