在Oracle創(chuàng)建索引的實際操作中會出現(xiàn)的限制條件
在Oracle創(chuàng)建索引的實際操作中有一些限制條件。就是說表或是列建立的相關(guān)索引并不是越多越好,而是相關(guān)索引建的越多,反而會影響到Oracle數(shù)據(jù)庫在運行中的整體性能,所以,在建立索引的時候,仍然會有一些限制條件。
一是不要對一些記錄內(nèi)容比較少的表建立索引
在一個應(yīng)用系統(tǒng)設(shè)計的時候,如設(shè)計一個ERP系統(tǒng)的數(shù)據(jù)庫,其雖然有幾千張表。但是,并不是每張表都有大量記錄的。相反,其中有近一半左右的數(shù)據(jù)表,可能其存儲的數(shù)據(jù)不會超過百條。如員工登陸帳戶密碼表、企業(yè)部門信息表等等。對于這些記錄內(nèi)容比較少的表,我們建立最好不要為其建立索引。無論是表上的,還是字段上,都不要Oracle建立索引。
二是若表中的內(nèi)容比較大
但是,這個表基本上不怎么查詢的時候,則只需要在表上建立索引即可;而不需要在字段上建立索引。如現(xiàn)在在ERP系統(tǒng)中,有一張表是“AD_Table”。其存儲的是這個數(shù)據(jù)庫中相關(guān)表的信息。這張表只有在數(shù)據(jù)庫設(shè)計的時候才會用到。故這張表中的記錄雖然比較多,但是由于用戶用的比較少,所以,一般沒有必要為這張表建立列級別上的索引。而直接用表索引來代替。
三是在一些NULL字段上
要根據(jù)實際情況來判斷是否要建立索引。如現(xiàn)在有一張人事檔案的表格,其上面有兩個字段,分別為“身份證號碼”與“地區(qū)”。有時會為了某個原因,企業(yè)需要所有員工都在系統(tǒng)中登記他們的身份證號碼,以方便他們辦工資卡、社會保險等等。所以人事管理可能需要經(jīng)常的查詢系統(tǒng),看看有沒有沒有身份證號碼的員工信息。
此時,就需要利用條件“IS NULL”來查詢我們所需要的記錄。故為了提高查詢效率,若某個記錄可能為空,并且經(jīng)常需要以NULL為條件進行查詢的時候,則最好給這個字段添加一個索引,并且最好建立位圖索引。相反,若雖然可能會以NULL這個條件作為查詢的限制語句,但是,用的不是很多的時候,則就沒有必要為其建立索引。
建議三:多表連接查詢的索引設(shè)計
如現(xiàn)在有一個人事管理系統(tǒng)。人事經(jīng)理想知道員工的社保繳納情況。他需要知道員工的姓名、職務(wù)、戶籍性質(zhì)(農(nóng)民戶口跟居民戶口費用不一樣)、繳納的情況等等。但是,這些信息包含在不同的表中。因為為了提高Oracle數(shù)據(jù)庫的性能,在表中存儲的可能只是某些序號,而不是具體的內(nèi)容。
如在社保表中,存儲的是員工對應(yīng)的編號,而不是員工的名字。所以,要得到這份報表的話,就可能需要關(guān)聯(lián)員工基本信息表、公司組織結(jié)構(gòu)表等表格,才能夠查詢到用戶所需要的內(nèi)容。為此,就需要利用Join語句,把這些表格關(guān)聯(lián)起來。為了提高數(shù)據(jù)庫的查詢效率,這些用來關(guān)聯(lián)的字段,最好能夠建立索引。這可以顯著的提高查詢的速度。
建議四:在表的更新速度與查詢速度之間尋求一個平衡點
眾所周知,索引本身并不影響數(shù)據(jù)庫的使用,其主要是為了提高Oracle數(shù)據(jù)庫的查詢效率。但是,由于當數(shù)據(jù)庫的表中的數(shù)據(jù)更新的時候,包括記錄的增加、刪除、更改等等,都會對雖有的索引進行更新。
很明顯,索引雖然可以提高查詢速度。但是,也會對一些表的更新操作產(chǎn)生不良的影響。當在表中建立的索引越多,這個不利影響也會越大。故Oracle數(shù)據(jù)庫管理員在設(shè)置索引的時候,還需要注意,在這兩個之間需要一個均衡點。
按照一般的理論來說,當某個表多數(shù)用來查詢、更新相對來說比較上的話,則要多多采用索引。相反,當某個表記錄更新居主導,查詢相對來說比較少的話,則不要建立太多的索引,避免對更新的速度差生不利影響。在實際工作中,若某個表頻繁的被視圖所調(diào)用的話,則最好就好設(shè)置比較多的索引了。
【編輯推薦】