Oracle建立索引要作到三個適當

Oracle數據庫中,建立索引雖然比較簡單。可是要合理的建立索引則比較困難了。筆者認爲,在建立索引時要作到三個適當,即在適當的表上、適當的列上建立適當數量的索引。雖然這能夠經過一句話來歸納優化的索引的基本準則,可是要作到這一點的話,須要數據庫管理員作出很大的努力。具體的來講,要作到這個三個適當有以下幾個要求。

  1、 根據表的大小來建立索引。

  雖然給表建立索引,能夠提升查詢的效率。可是數據庫管理員須要注意的是,索引也須要必定的開銷的。爲此並非說給全部的表都建立索引,那麼就能夠提升數據庫的性能。這個認識是錯誤的。偏偏相反,若是無論三七二十一,給全部的表都建立了索引,那麼其反而會給數據庫的性能形成負面的影響。由於此時濫用索引的開銷可能已經遠遠大於由此帶來的性能方面的收益。因此筆者認爲,數據庫管理員首先須要作到,爲合適的表來創建索引,而不是爲全部的表創建索引。

  通常來講,不須要爲比較小的表建立索引。如在一個ERP系統的數據庫中,department表用來存儲企業部門的信息。通常企業的部分也就十幾個,最多不會超過一百個。這100條記錄對於人來講,可能算是比較多了。可是對於計算機來講,這給他塞塞牙縫都還不夠。因此,對相似的小表沒有必要創建索引。由於即便創建了索引,其性能也不會獲得很大的改善。相反索引創建的開銷,如維護成本等等,要比這個要大。也就是說,付出的要比獲得的多,顯然違反常理。

  另外,就是對於超大的表,也不必定要創建索引。有些表雖然比較大,記錄數量很是的多。可是此時爲這個表創建索引並必定的合適。如系統中有一張表,其主要用來保存數據庫中的一些變動信息。每每這些信息只給數據庫管理員使用。此時爲這張表創建索引的話,反而不合適。由於這張表不多用到,只有在出問題的時候才須要查看。其次其即便查看,須要查詢的紀錄也不會不少,可能就是最近一週的更新記錄等等。對於對於一些超大的表,創建索引有時候每每不可以達到預計的效果。並且在打表上創建索引,其索引的開銷要比普通的表大的多。那麼究竟是否給大表創建索引呢?筆者認爲,主要是看兩個方面的內容。首先是須要關注一下,在這張大表中常常須要查詢的記錄數量。通常來講,若是常常須要查詢的數據不超過10%15%的話,那就沒有必要爲其創建索引的必要。由於此時創建索引的開銷可能要比性能的改善大的多。這個比例只是一個經驗的數據。若是數據庫管理員須要得出一個比較精確的結論,那麼就須要進行測試分析。即數據庫管理員須要測試一下全表掃描的時間,看看其是否比創建索引後的查詢時間要長或者短。若是是長的話,則說明有創建索引的必要。可是若是沒有的話,則說明仍是全表掃描速度來的快。此時也就沒有必要創建索引了。

  總之,在考慮是否該爲表創建索引時,通常來講小表沒有創建索引的必要。而對於打表的話,則須要進行實際狀況實際分析。簡單一點的,能夠根據大體的比率來肯定。若是要精確一點的,則能夠進行全表掃描性能分析,以判斷創建索引後是否真的如預期那樣改善了數據庫性能。

  2、 根據列的特徵來建立索引。

  列的特色不一樣,索引建立的效果也不一樣。數據庫管理員須要瞭解爲哪些列建立索引能夠起到事倍功半的效果。同時也須要了解爲哪些列建立索引反而起到的是事倍功半的效果。這有利於他們瞭解到底給爲怎麼樣的字段創建索引。

  根據筆者的經驗,每每爲以下特徵的列建立索引可以起到比較明顯的效果。如對於一些重複內容比較少的列,特別是對於那些定義了惟一約束的列。在這些列上創建索引,每每能夠起到很是不錯的效果。如對於一些null值的列與非Null值的列混合狀況下,若是用戶須要常常查詢全部的非Null值記錄的列,則最好爲其設置索引。若是常常須要多表鏈接查詢,在用與鏈接的列上設置索引能夠達到事半功倍的效果。

  可見,索引設置的是否恰當,不只跟數據庫設計架構有關,並且還跟企業的經濟業務相關。爲此,對於一些套裝軟件,雖然一開始數據庫管理員已經作了索引的優化工做。可是隨着後來經濟數據的增長,這個索引的效果會愈來愈打折扣。這主要是由於記錄的表化影響到了索引優化的效果。因此筆者建議各位數據庫管理員,即便採用的是大牌軟件公司的套裝軟件,也須要隔一段時間,如一年,對數據庫的索引進行優化。該去掉的去掉,該調整的調整,以提升數據庫的性能。

  如在數據庫中有一張表是用來保存用戶信息的。其中有個字段身份證號碼,這是一個惟一的字段。在數據庫設計時,給這個字段建立了索引。可是當這個數據庫投入使用以後, 用戶不怎麼輸入用戶的身份證號碼。並且平時也基本不按這個號碼來進行查詢。當記錄月來月多時,這個身份證號碼上的索引字段不但不可以改善數據庫的查詢性能,反而成了雞肋。對於這些有不少NULL值的列,並且不會常常查詢全部的非NULL值記錄的列,數據庫管理員要下決心,即便清除這些列上的索引。

  因此說索引的優化與調整是一個動態的過程,並非說數據庫設計好以後就不須要通過調整。數據庫管理員每每須要根據記錄的變化狀況,來進行適當的變動。以提升索引的效果。

3、 在一個表上建立多少索引合適?

  雖說,在表上建立索引的數量沒有限制,可是決不是越多越好。也就是說,在建立索引這項事情上,1+12每每不成立。有時候,建立索引越多,其可能會獲得拔苗助長的效果。那麼在一個表上,到底給建立多少索引合適呢?這個沒有一個明確的標準。而是須要數據庫管理員根據實際的用途以及數據庫中記錄的狀況,來進行判斷。

  一般來講,表的索引越多,其查詢的速度也就越快。可是,表的更新速度則會下降。這主要是由於表的更新(如往表中插入一條記錄)速度,反而隨着索引的增長而增長。這主要是由於,在更新記錄的同時須要更新相關的索引信息。爲此,到底在表中建立多少索引合適,就須要在這個更新速度與查詢速度之間取得一個均衡點。如對於一些數據倉庫或者決策型數據庫系統,其主要用來進行查詢。相關的記錄每每是在數據庫初始化的時候倒入。此時,設置的索引多一點,能夠提升數據庫的查詢性能。同時由於記錄不怎麼更新,因此索引比較多的狀況下,也不會影響到更新的速度。即便在起初的時候須要導入大量的數據,此時也能夠先將索引禁用掉。等到數據導入完畢後,再啓用索引。能夠經過這種方式來減小索引對數據更新的影響。相反,若是那些表中常常須要更新記錄,如一些事務型的應用系統,數據更新操做是屢見不鮮的事情。此時若是在一張表中創建過多的索引,則會影響到更新的速度。因爲更新操做比較頻繁,因此對其的負面影響,要比查詢效率提高要大的多。此時就須要限制索引的數量,只在一些必要的字段上創建索引。

  筆者在平時數據庫優化時,每每會根據這些表的用途來爲列設置索引。能夠查詢相關的動態視圖,看看對於這張表的操做,是更新操做(包括更新、刪除、插入等等)佔的比例大,仍是查詢操做佔的比例大。當過多的索引已經影響到更新操做的速度時,則數據庫管理員就須要先禁用某些索引,以提升數據庫的性能。

  總之,在適當的表、適當的列上創建適當的索引。這一句話包含的意思有不少,以上內容只是一部份內容。俗話說,師傅領進門,修行靠自身。筆者在這裏指可以點到爲止。一些具體的索引優化內容仍是須要各位讀者在平常工做中去體會與總結。
數據庫

Oracle建立索引的實際操做中會出現的限制條件

Oracle建立索引的實際操做中有一些限制條件。就是說表或是列創建的相關索引並非越多越好,而是相關索引建的越多,反而會影響到Oracle數據庫在運行中的總體性能,因此,在創建索引的時候,仍然會有一些限制條件。架構

一是不要對一些記錄內容比較少的表創建索引數據庫設計

在一個應用系統設計的時候,如設計一個ERP系統的數據庫,其雖然有幾千張表。可是,並非每張表都有大量記錄的。相反,其中有近一半左右的數據表,可能其存儲的數據不會超過百條。如員工登錄賬戶密碼錶、企業部門信息表等等。對於這些記錄內容比較少的表,咱們創建最好不要爲其創建索引。不管是表上的,仍是字段上,都不要Oracle創建索引。性能

二是若表中的內容比較大測試

可是,這個表基本上不怎麼查詢的時候,則只須要在表上創建索引便可;而不須要在字段上創建索引。如如今在ERP系統中,有一張表是「AD_Table」。其存儲的是這個數據庫中相關表的信息。這張表只有在數據庫設計的時候纔會用到。故這張表中的記錄雖然比較多,可是因爲用戶用的比較少,因此,通常沒有必要爲這張表創建列級別上的索引。而直接用表索引來代替。優化

三是在一些NULL字段上spa

要根據實際狀況來判斷是否要創建索引。如如今有一張人事檔案的表格,其上面有兩個字段,分別爲身份證號碼地區。有時會爲了某個緣由,企業須要全部員工都在系統中登記他們的身份證號碼,以方便他們辦工資卡、社會保險等等。因此人事管理可能須要常常的查詢系統,看看有沒有沒有身份證號碼的員工信息。設計

此時,就須要利用條件「IS NULL」來查詢咱們所須要的記錄。故爲了提升查詢效率,若某個記錄可能爲空,而且常常須要以NULL爲條件進行查詢的時候,則最好給這個字段添加一個索引,而且最好創建位圖索引。相反,若雖然可能會以NULL這個條件做爲查詢的限制語句,可是,用的不是不少的時候,則就沒有必要爲其創建索引。htm

建議三:多表鏈接查詢的索引設計索引

如如今有一我的事管理系統。人事經理想知道員工的社保繳納狀況。他須要知道員工的姓名、職務、戶籍性質(農民戶口跟居民戶口費用不同)、繳納的狀況等等。可是,這些信息包含在不一樣的表中。由於爲了提升Oracle數據庫的性能,在表中存儲的可能只是某些序號,而不是具體的內容。

如在社保表中,存儲的是員工對應的編號,而不是員工的名字。因此,要獲得這份報表的話,就可能須要關聯員工基本信息表、公司組織結構表等表格,纔可以查詢到用戶所須要的內容。爲此,就須要利用Join語句,把這些表格關聯起來。爲了提升數據庫的查詢效率,這些用來關聯的字段,最好可以創建索引。這能夠顯著的提升查詢的速度。

建議四:在表的更新速度與查詢速度之間尋求一個平衡點

衆所周知,索引自己並不影響數據庫的使用,其主要是爲了提升Oracle數據庫的查詢效率。可是,因爲當數據庫的表中的數據更新的時候,包括記錄的增長、刪除、更改等等,都會對雖有的索引進行更新。

很明顯,索引雖然能夠提升查詢速度。可是,也會對一些表的更新操做產生不良的影響。當在表中創建的索引越多,這個不利影響也會越大。故Oracle數據庫管理員在設置索引的時候,還須要注意,在這兩個之間須要一個均衡點。

按照通常的理論來講,當某個表多數用來查詢、更新相對來講比較上的話,則要多多采用索引。相反,當某個表記錄更新居主導,查詢相對來講比較少的話,則不要創建太多的索引,避免對更新的速度差生不利影響。在實際工做中,若某個表頻繁的被視圖所調用的話,則最好就好設置比較多的索引了。

相關文章
相關標籤/搜索