在Oracle數據庫中,創建索引雖然比較簡單。但是要合理的創建索引則比較困難了。筆者認為,在創 建索引時要做到三個適當,即在適當的表上、適當的列上創建適當數量的索引。雖然這可以通過一句話來 概括優化的索引的基本准則,但是要做到這一點的話,需要數據庫管理員做出很大的努力。具體的來說, 要做到這個三個適當有如下幾個要求。
一、 根據表的大小來創建索引。
雖然給表創建索引,可以提高查詢的效率。但是數據庫管理員需要注意的是,索引也需要一定的開銷 的。為此並不是說給所有的表都創建索引,那麼就可以提高數據庫的性能。這個認識是錯誤的。恰恰相反 ,如果不管三七二十一,給所有的表都創建了索引,那麼其反而會給數據庫的性能造成負面的影響。因為 此時濫用索引的開銷可能已經遠遠大於由此帶來的性能方面的收益。所以筆者認為,數據庫管理員首先需 要做到,為合適的表來建立索引,而不是為所有的表建立索引。
一般來說,不需要為比較小的表創建索引。如在一個ERP系統的數據庫中,department表用來存儲企業 部門的信息。一般企業的部分也就十幾個,最多不會超過一百個。這100條記錄對於人來說,可能算是比 較多了。但是對於計算機來說,這給他塞塞牙縫都還不夠。所以,對類似的小表沒有必要建立索引。因為 即使建立了索引,其性能也不會得到很大的改善。相反索引建立的開銷,如維護成本等等,要比這個要大 。也就是說,付出的要比得到的多,顯然違反常理。
另外,就是對於超大的表,也不一定要建立索引。有些表雖然比較大,記錄數量非常的多。但是此時 為這個表建立索引並一定的合適。如系統中有一張表,其主要用來保存數據庫中的一些變更信息。往往這 些信息只給數據庫管理員使用。此時為這張表建立索引的話,反而不合適。因為這張表很少用到,只有在 出問題的時候才需要查看。其次其即使查看,需要查詢的紀錄也不會很多,可能就是最近一周的更新記錄 等等。對於對於一些超大的表,建立索引有時候往往不能夠達到預計的效果。而且在打表上建立索引,其 索引的開銷要比普通的表大的多。那麼到底是否給大表建立索引呢?筆者認為,主要是看兩個方面的內容 。首先是需要關注一下,在這張大表中經常需要查詢的記錄數量。一般來說,如果經常需要查詢的數據不 超過10%到15%的話,那就沒有必要為其建立索引的必要。因為此時建立索引的開銷可能要比性能的改善大 的多。這個比例只是一個經驗的數據。如果數據庫管理員需要得出一個比較精確的結論,那麼就需要進行 測試分析。即數據庫管理員需要測試一下全表掃描的時間,看看其是否比建立索引後的查詢時間要長或者 短。如果是長的話,則說明有建立索引的必要。但是如果沒有的話,則說明還是全表掃描速度來的快。此 時也就沒有必要建立索引了。
總之,在考慮是否該為表建立索引時,一般來說小表沒有建立索引的必要。而對於打表的話,則需要 進行實際情況實際分析。簡單一點的,可以根據大致的比率來確定。如果要精確一點的,則可以進行全表 掃描性能分析,以判斷建立索引後是否真的如預期那樣改善了數據庫性能。