- 相關(guān)推薦
ORACLE數(shù)據(jù)表管理建議
ORACLE數(shù)據(jù)庫(kù)中,表是最基本的內(nèi)容?梢哉f(shuō),表設(shè)計(jì)的好壞直接跟數(shù)據(jù)庫(kù)的性能相關(guān)。所以,在設(shè)計(jì)表的時(shí)候,除了要遵循其固有的數(shù)據(jù)庫(kù)準(zhǔn)則之外,還需要看個(gè)人的數(shù)據(jù)庫(kù)管理經(jīng)驗(yàn)。
一、 表該存放在哪里?
我們都知道,在ORACLE數(shù)據(jù)庫(kù)中,使利用空間這個(gè)概念來(lái)管理表對(duì)象的。在數(shù)據(jù)庫(kù)創(chuàng)建的時(shí)候,數(shù)據(jù)庫(kù)中已經(jīng)建立了一些表空間。那么當(dāng)我們新建立表的時(shí)候,這個(gè)新表的位置該放在什么地方呢?這就好像吃飯時(shí)的坐的位置一樣,是有講究的。一般來(lái)說(shuō),我們?cè)谛陆ū淼臅r(shí)候,至少要遵循如下建議:
一是在數(shù)據(jù)庫(kù)創(chuàng)建的時(shí)候,在數(shù)據(jù)庫(kù)中已經(jīng)有了一個(gè)SYSTEM的表空間。一般情況下,這個(gè)表空間中,只包含數(shù)據(jù)字典及Oracle系統(tǒng)對(duì)象。如果我們將我們的表建立在這個(gè)空間上的話(huà),那是要降低數(shù)據(jù)庫(kù)的性能的。所以,一般我們是不建議用戶(hù)把表格建立在這個(gè)空間上。但是,若我們不只一個(gè)人維護(hù)數(shù)據(jù)庫(kù),如有八個(gè)人共同設(shè)計(jì)數(shù)據(jù)庫(kù)系統(tǒng)時(shí),如何才能保證其他用戶(hù)不在SYSTEM表空間中建立數(shù)據(jù)庫(kù)表格呢?最好的辦法就是通過(guò)權(quán)限控制。如我們可以給每個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)人員指定一個(gè)默認(rèn)的表空間,讓他們只能在這個(gè)表空間中建立表格。如此的話(huà),就能防止他們?cè)赟YSTEM表空間中建立自己的數(shù)據(jù)表格,從而對(duì)數(shù)據(jù)庫(kù)的運(yùn)行性能產(chǎn)生不良影響。所以,若給每個(gè)用戶(hù)設(shè)置默認(rèn)表空間的話(huà),那么用戶(hù)在建立具體的表時(shí),不用具體指定表空間了。
二是我們?cè)跒槟硞(gè)應(yīng)用設(shè)計(jì)數(shù)據(jù)庫(kù)的時(shí)候,最好先對(duì)表的空間進(jìn)行規(guī)劃。一般情況下,不要把數(shù)據(jù)表隨意的分散到不同的表空間中去。如我們?cè)跒橐粋(gè)ERP系統(tǒng)設(shè)計(jì)數(shù)據(jù)庫(kù)的時(shí)候,若把采購(gòu)部門(mén)相關(guān)的表跟銷(xiāo)售部門(mén)相關(guān)的表放到兩個(gè)不同的表空間中去,這是不明智的做法。這么處理的話(huà),會(huì)降低某些數(shù)據(jù)庫(kù)管理和維護(hù)操作的效率,如數(shù)據(jù)的備份與恢復(fù)操作;而且,也無(wú)法集中管理屬于某個(gè)特定應(yīng)用的數(shù)據(jù)。所以,我們一般建議,在規(guī)劃數(shù)據(jù)庫(kù)表空間的時(shí)候,把相同應(yīng)用的表放在同一個(gè)表空間中去。如果要區(qū)分不同部門(mén)或者不同模塊的表的話(huà),我們可以在表的命名上動(dòng)腦子。如我們?cè)谠O(shè)計(jì)ERP系統(tǒng)的數(shù)據(jù)庫(kù)中,可以根據(jù)其應(yīng)用模塊的不同,在前面加上前綴來(lái)進(jìn)行識(shí)別。如跟系統(tǒng)基本配置相關(guān)的表,我們可以用AD為前綴;而跟銷(xiāo)售部門(mén)相關(guān)的表,我們可以加上SA前綴等等。如此的話(huà),這些表具體是屬于哪個(gè)模塊的,就一清二楚了。完全沒(méi)有必要為此設(shè)置不同的表空間。這是ORACLE數(shù)據(jù)庫(kù)初學(xué)者經(jīng)常會(huì)犯的錯(cuò)誤。主要是對(duì)ORACLE表空間的定義不是很熟悉所導(dǎo)致的。
二、 對(duì)預(yù)計(jì)存儲(chǔ)數(shù)量比較大的表時(shí),要給與額外的重視。
有些表非常的大。我們這邊說(shuō)的大,不一定是說(shuō)結(jié)構(gòu)復(fù)雜,而是指在這個(gè)表格中,預(yù)期會(huì)存儲(chǔ)比較多的數(shù)據(jù)。為了提高對(duì)這個(gè)表格的處理效率,我們?cè)谑孪纫龀鲆欢ǖ陌才。否則的話(huà),后續(xù)對(duì)這些大表進(jìn)行查詢(xún)、插入等操作的話(huà),速度會(huì)很慢。所以,我們就有必要在數(shù)據(jù)庫(kù)設(shè)計(jì)的時(shí)候,先預(yù)先估計(jì)一下表的數(shù)據(jù)存儲(chǔ)量,把一些數(shù)據(jù)量大的表格,做一些額外的設(shè)置。如在ERP軟件的數(shù)據(jù)庫(kù)設(shè)置中,一般來(lái)說(shuō),產(chǎn)品數(shù)據(jù)與物料清單數(shù)據(jù)這兩個(gè)表的數(shù)據(jù)量會(huì)比較大;而從長(zhǎng)遠(yuǎn)看的話(huà),銷(xiāo)售訂單、采購(gòu)訂單、生產(chǎn)訂單、記賬憑證等這種單據(jù)類(lèi)相關(guān)的表格其數(shù)據(jù)量也會(huì)比較大。一年兩年可能感覺(jué)不出來(lái),但是,到十年后,這個(gè)紀(jì)錄數(shù)量就會(huì)很龐大。而像ERP系統(tǒng)這種大型的信息化管理項(xiàng)目,用個(gè)幾十年時(shí)很正常的事情。而且,為了記錄的完整性,也不建議用戶(hù)把以前的數(shù)據(jù)刪除。所以,為這種應(yīng)用進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)的時(shí)候,要充分考慮這些大表的性能問(wèn)題。
具體的來(lái)說(shuō),設(shè)計(jì)大表的時(shí)候,可以考慮遵循如下的建議。
一是不要為大表設(shè)置存儲(chǔ)的限制。在ORACLE數(shù)據(jù)庫(kù)中,可以為每張表格設(shè)置存儲(chǔ)配額限制。如此的話(huà),表最大容量就不能超過(guò)這個(gè)限制。對(duì)于一些數(shù)據(jù)容量比較小的表格,這么設(shè)置時(shí)合理的,可以提高空間的利用率。但是,若數(shù)據(jù)量比較大的話(huà),就不建議事先設(shè)置表的存儲(chǔ)空間了。如ERP系統(tǒng)的銷(xiāo)售訂單表,其剛開(kāi)始可能記錄量很小,第一年預(yù)計(jì)只有1G的記錄容量,但是,估計(jì)在十年后,這個(gè)記錄容量就會(huì)達(dá)到10G了。在這種情況下,我們?cè)趺磥?lái)給其設(shè)置存儲(chǔ)空間呢?一開(kāi)就設(shè)置10G空間,這也是不合理的。而且,設(shè)置存儲(chǔ)空間,就意味著有可能產(chǎn)生存儲(chǔ)碎片,從而影響到數(shù)據(jù)查詢(xún)的效率。所以,在數(shù)據(jù)庫(kù)表的設(shè)計(jì)過(guò)程中,若某些應(yīng)用的表可能會(huì)有比較大的數(shù)據(jù)容量時(shí),建議不要對(duì)其存儲(chǔ)空間做出任何的限制。
二是要為這大表分配足夠的臨時(shí)空間。如我們使用ERP系統(tǒng)時(shí),要查詢(xún)產(chǎn)品資料信息。我們都知道,產(chǎn)品信息的話(huà),有些企業(yè)這個(gè)紀(jì)錄數(shù)非常的龐大。而且在查詢(xún)時(shí),我們還會(huì)經(jīng)常的進(jìn)行排序操作。如有時(shí)候會(huì)按照產(chǎn)品編碼對(duì)查詢(xún)出來(lái)的數(shù)據(jù)進(jìn)行排序。當(dāng)記錄少的話(huà),還好;但是,當(dāng)記錄多的話(huà),這個(gè)排序動(dòng)作,要求具有比較大的臨時(shí)存儲(chǔ)空間。所以,當(dāng)某個(gè)表預(yù)計(jì)會(huì)有很大的記錄數(shù)量的時(shí)候,我們就要給其分配足夠多的臨時(shí)空間。臨時(shí)空間的存儲(chǔ)參數(shù)設(shè)置取決于臨時(shí)表空間的默認(rèn)儲(chǔ)存參數(shù)設(shè)置。我們可以更改這些參數(shù),以達(dá)到我們對(duì)要求。若沒(méi)有給大表分配足夠多的臨時(shí)空間的話(huà),則排序的動(dòng)作將會(huì)很慢,而且很可能不成功。
三是要考慮將表與表的索引分離存放。大表所對(duì)應(yīng)的索引通常也比較大。一般來(lái)說(shuō),索引的數(shù)量是隨著表記錄的數(shù)量增加而增加,兩者是接近于一個(gè)正比例的關(guān)系。所以,通常表的記錄容量大的時(shí)候,索引數(shù)量也會(huì)很龐大。針對(duì)這種情況,我們考慮突破我們上面講的表空間的規(guī)則定義。而考慮把表和他的索引分別存儲(chǔ)于不同的表空間中,甚至在條件允許的情況下,分別存儲(chǔ)于不同的硬盤(pán)中。這么做的好處是什么呢?最大的好處是讓索引比較容易的獲得所需要的連續(xù)的存儲(chǔ)空間,從而提高輸入輸入的效率。通俗的說(shuō),就是可以提高數(shù)據(jù)的查詢(xún)效率。如不這么處理的話(huà),查詢(xún)大容量的記錄的話(huà),數(shù)據(jù)庫(kù)可能需要花費(fèi)30秒;而如此設(shè)計(jì)的話(huà),就可能把時(shí)間縮短為10秒。這是一個(gè)很明顯的性能改善。
三、 如何給表命名?
上面我在講如何為表分配存儲(chǔ)空間的時(shí)候,已經(jīng)講到過(guò)這方面的問(wèn)題。下面,我就將對(duì)這個(gè)問(wèn)題進(jìn)行詳細(xì)的描述,以幫助數(shù)據(jù)庫(kù)管理員掌握一套好的數(shù)據(jù)庫(kù)命名規(guī)則。
首先,毋庸置疑的,在為標(biāo)命名的時(shí)候,要遵循ORACLE數(shù)據(jù)庫(kù)的基本命名規(guī)則,如不能以數(shù)字開(kāi)頭為表命名,如不能利用數(shù)據(jù)庫(kù)的關(guān)鍵字為表命名,如表的名字不能重復(fù)等等。這些是最基本的要求,就不用我多費(fèi)口舌了。除了要遵循這些基本的命名規(guī)則外,在實(shí)際工作中,為了數(shù)據(jù)庫(kù)后續(xù)的維護(hù)等方面出發(fā),我們還是要遵循一些額外的規(guī)則。這些規(guī)則跟ORACLE定義的規(guī)則不同。我們所講的規(guī)則沒(méi)有約束力,可以說(shuō),只是業(yè)界的一些共識(shí)而已。你若不怎么處理,ORACLE數(shù)據(jù)庫(kù)也不會(huì)說(shuō)你錯(cuò)誤,只是后續(xù)維護(hù)的時(shí)候,會(huì)比較麻煩而已。
一是在對(duì)數(shù)據(jù)庫(kù)命名的時(shí)候,最好能跟體現(xiàn)表的分類(lèi)關(guān)系。如最常見(jiàn)的,我們?cè)谠O(shè)計(jì)數(shù)據(jù)庫(kù)的時(shí)候,表都是按系統(tǒng)的具體模塊來(lái)區(qū)分的,如根據(jù)前端系統(tǒng)要求的不同,數(shù)據(jù)庫(kù)的表大致可以分為系統(tǒng)基本配置表、銷(xiāo)售模塊表、采購(gòu)模塊表、報(bào)表模塊表等等。我們可以根據(jù)這些模塊的不同,分別給與不同的前綴來(lái)區(qū)分。這么做的好處是很明顯的。如一看到表最大名字,就可以知道這個(gè)表是屬于哪個(gè)應(yīng)用的、哪個(gè)模塊的,這無(wú)疑可以提高數(shù)據(jù)庫(kù)設(shè)計(jì)與前臺(tái)軟件開(kāi)發(fā)的效率。同時(shí),數(shù)據(jù)庫(kù)中默認(rèn)的排序規(guī)則是按名字來(lái)排序的,所以,為表格設(shè)置類(lèi)別前綴的話(huà),可以把同一類(lèi)的表格排在一起,方便我們察看。
二是對(duì)表格命名的時(shí)候,要考慮可讀性,而不能隨便阿狗阿貓的亂取名字。最常見(jiàn)的是,那些剛學(xué)數(shù)據(jù)庫(kù)的人,在表命名的時(shí)候,如要建幾張測(cè)試表,就會(huì)隨便命名如TEST1,TEST2之類(lèi)的。雖然這只是測(cè)試,但是,也不符合我們的命名過(guò)則。要做測(cè)試的話(huà),那就以TEST開(kāi)頭,然后后面加上具體要測(cè)試的內(nèi)容。如此的話(huà),我們才可以通過(guò)表的名字知道該表具體的用途。而不用打開(kāi)表去看里面具體的結(jié)構(gòu)或者注釋才能知道我們需要的信息。所以,在設(shè)計(jì)表的名字的時(shí)候,還要關(guān)注一下其的可讀性。
【ORACLE數(shù)據(jù)表管理建議】相關(guān)文章:
Oracle發(fā)展歷程08-25
Oracle認(rèn)證體系介紹01-30
oracle認(rèn)證考試詳情06-09
Oracle DBA職業(yè)要求08-31
Oracle認(rèn)證考試介紹05-03
關(guān)于Oracle認(rèn)證考試時(shí)間09-27