ORACLE數據表管理建議

ORACLE數據庫中,表是最基本的內容。可以說,表設計的好壞直接跟數據庫的性能相關。所以,在設計表的時候,除了要遵循其固有的數據庫準則之外,還需要看個人的數據庫管理經驗。

ORACLE數據表管理建議

  一、 表該存放在哪裏?

我們都知道,在ORACLE數據庫中,使利用空間這個概念來管理表對象的。在數據庫創建的時候,數據庫中已經建立了一些表空間。那麼當我們新建立表的時候,這個新表的位置該放在什麼地方呢?這就好像吃飯時的坐的位置一樣,是有講究的。一般來說,我們在新建表的時候,至少要遵循如下建議:

一是在數據庫創建的時候,在數據庫中已經有了一個SYSTEM的表空間。一般情況下,這個表空間中,只包含數據字典及Oracle系統對象。如果我們將我們的表建立在這個空間上的話,那是要降低數據庫的性能的。所以,一般我們是不建議用戶把表格建立在這個空間上。但是,若我們不只一個人維護數據庫,如有八個人共同設計數據庫系統時,如何才能保證其他用戶不在SYSTEM表空間中建立數據庫表格呢?最好的辦法就是通過權限控制。如我們可以給每個數據庫設計人員指定一個默認的表空間,讓他們只能在這個表空間中建立表格。如此的話,就能防止他們在SYSTEM表空間中建立自己的數據表格,從而對數據庫的運行性能產生不良影響。所以,若給每個用戶設置默認表空間的話,那麼用戶在建立具體的表時,不用具體指定表空間了。

二是我們在爲某個應用設計數據庫的時候,最好先對錶的空間進行規劃。一般情況下,不要把數據表隨意的分散到不同的表空間中去。如我們在爲一個ERP系統設計數據庫的時候,若把採購部門相關的表跟銷售部門相關的表放到兩個不同的表空間中去,這是不明智的做法。這麼處理的話,會降低某些數據庫管理和維護操作的效率,如數據的備份與恢復操作;而且,也無法集中管理屬於某個特定應用的數據。所以,我們一般建議,在規劃數據庫表空間的時候,把相同應用的表放在同一個表空間中去。如果要區分不同部門或者不同模塊的表的話,我們可以在表的命名上動腦子。如我們在設計ERP系統的數據庫中,可以根據其應用模塊的'不同,在前面加上前綴來進行識別。如跟系統基本配置相關的表,我們可以用AD爲前綴;而跟銷售部門相關的表,我們可以加上SA前綴等等。如此的話,這些表具體是屬於哪個模塊的,就一清二楚了。完全沒有必要爲此設置不同的表空間。這是ORACLE數據庫初學者經常會犯的錯誤。主要是對ORACLE表空間的定義不是很熟悉所導致的。

  二、 對預計存儲數量比較大的表時,要給與額外的重視。

有些表非常的大。我們這邊說的大,不一定是說結構複雜,而是指在這個表格中,預期會存儲比較多的數據。爲了提高對這個表格的處理效率,我們在事先要做出一定的安排。否則的話,後續對這些大表進行查詢、插入等操作的話,速度會很慢。所以,我們就有必要在數據庫設計的時候,先預先估計一下表的數據存儲量,把一些數據量大的表格,做一些額外的設置。如在ERP軟件的數據庫設置中,一般來說,產品數據與物料清單數據這兩個表的數據量會比較大;而從長遠看的話,銷售訂單、採購訂單、生產訂單、記賬憑證等這種單據類相關的表格其數據量也會比較大。一年兩年可能感覺不出來,但是,到十年後,這個紀錄數量就會很龐大。而像ERP系統這種大型的信息化管理項目,用個幾十年時很正常的事情。而且,爲了記錄的完整性,也不建議用戶把以前的數據刪除。所以,爲這種應用進行數據庫設計的時候,要充分考慮這些大表的性能問題。

具體的來說,設計大表的時候,可以考慮遵循如下的建議。

一是不要爲大表設置存儲的限制。在ORACLE數據庫中,可以爲每張表格設置存儲配額限制。如此的話,表最大容量就不能超過這個限制。對於一些數據容量比較小的表格,這麼設置時合理的,可以提高空間的利用率。但是,若數據量比較大的話,就不建議事先設置表的存儲空間了。如ERP系統的銷售訂單表,其剛開始可能記錄量很小,第一年預計只有1G的記錄容量,但是,估計在十年後,這個記錄容量就會達到10G了。在這種情況下,我們怎麼來給其設置存儲空間呢?一開就設置10G空間,這也是不合理的。而且,設置存儲空間,就意味着有可能產生存儲碎片,從而影響到數據查詢的效率。所以,在數據庫表的設計過程中,若某些應用的表可能會有比較大的數據容量時,建議不要對其存儲空間做出任何的限制。

二是要爲這大表分配足夠的臨時空間。如我們使用ERP系統時,要查詢產品資料信息。我們都知道,產品信息的話,有些企業這個紀錄數非常的龐大。而且在查詢時,我們還會經常的進行排序操作。如有時候會按照產品編碼對查詢出來的數據進行排序。當記錄少的話,還好;但是,當記錄多的話,這個排序動作,要求具有比較大的臨時存儲空間。所以,當某個表預計會有很大的記錄數量的時候,我們就要給其分配足夠多的臨時空間。臨時空間的存儲參數設置取決於臨時表空間的默認儲存參數設置。我們可以更改這些參數,以達到我們對要求。若沒有給大表分配足夠多的臨時空間的話,則排序的動作將會很慢,而且很可能不成功。

三是要考慮將表與表的索引分離存放。大表所對應的索引通常也比較大。一般來說,索引的數量是隨着表記錄的數量增加而增加,兩者是接近於一個正比例的關係。所以,通常表的記錄容量大的時候,索引數量也會很龐大。針對這種情況,我們考慮突破我們上面講的表空間的規則定義。而考慮把表和他的索引分別存儲於不同的表空間中,甚至在條件允許的情況下,分別存儲於不同的硬盤中。這麼做的好處是什麼呢?最大的好處是讓索引比較容易的獲得所需要的連續的存儲空間,從而提高輸入輸入的效率。通俗的說,就是可以提高數據的查詢效率。如不這麼處理的話,查詢大容量的記錄的話,數據庫可能需要花費30秒;而如此設計的話,就可能把時間縮短爲10秒。這是一個很明顯的性能改善。

  三、 如何給表命名?

上面我在講如何爲表分配存儲空間的時候,已經講到過這方面的問題。下面,我就將對這個問題進行詳細的描述,以幫助數據庫管理員掌握一套好的數據庫命名規則。

首先,毋庸置疑的,在爲標命名的時候,要遵循ORACLE數據庫的基本命名規則,如不能以數字開頭爲表命名,如不能利用數據庫的關鍵字爲表命名,如表的名字不能重複等等。這些是最基本的要求,就不用我多費口舌了。除了要遵循這些基本的命名規則外,在實際工作中,爲了數據庫後續的維護等方面出發,我們還是要遵循一些額外的規則。這些規則跟ORACLE定義的規則不同。我們所講的規則沒有約束力,可以說,只是業界的一些共識而已。你若不怎麼處理,ORACLE數據庫也不會說你錯誤,只是後續維護的時候,會比較麻煩而已。

一是在對數據庫命名的時候,最好能跟體現表的分類關係。如最常見的,我們在設計數據庫的時候,表都是按系統的具體模塊來區分的,如根據前端系統要求的不同,數據庫的表大致可以分爲系統基本配置表、銷售模塊表、採購模塊表、報表模塊表等等。我們可以根據這些模塊的不同,分別給與不同的前綴來區分。這麼做的好處是很明顯的。如一看到表最大名字,就可以知道這個表是屬於哪個應用的、哪個模塊的,這無疑可以提高數據庫設計與前臺軟件開發的效率。同時,數據庫中默認的排序規則是按名字來排序的,所以,爲表格設置類別前綴的話,可以把同一類的表格排在一起,方便我們察看。

二是對錶格命名的時候,要考慮可讀性,而不能隨便阿狗阿貓的亂取名字。最常見的是,那些剛學數據庫的人,在表命名的時候,如要建幾張測試表,就會隨便命名如TEST1,TEST2之類的。雖然這只是測試,但是,也不符合我們的命名過則。要做測試的話,那就以TEST開頭,然後後面加上具體要測試的內容。如此的話,我們纔可以通過表的名字知道該表具體的用途。而不用打開表去看裏面具體的結構或者註釋才能知道我們需要的信息。所以,在設計表的名字的時候,還要關注一下其的可讀性。