筆者認為對於資料庫索引的作用,應該分兩面看。除了肯定其對資料庫效能帶來的正面影響外,還需要認識到其可能帶來的負面影響。只有如此,資料庫管理員才能夠在正確的場合使用正確的索引。要知道有時候乙個錯誤的索引可能引發死鎖,並導致資料庫效能的急劇下降或程序終止;而如果資料庫管理員能夠做出乙個正確的判斷的話,那麼可以使那些本來要執行幾個小時甚至一天的程序在幾分鐘之內就能夠完成。所以這兩個差距是乙個天上、乙個地下。故筆者希望通過這篇文章能夠讓各位讀者了解索引在使用過程中的限制,了解索引並不是萬能的。
一、索引對資料庫效能的影響跟資料選擇性直接掛鉤。
當使用者從資料表中查詢資料時,oracle資料庫提供了兩種查詢的方式。一是從表中讀取每一行,就是大家常說的全表掃瞄;二是通過rowid一此讀取一行。當表中記錄比較多的時候,很明顯第二種方式能夠更快的定位記錄內容。而索引其實就是建立在這個查詢原理之上的。如現在某個表中有300多萬條記錄,而現在使用者可能只需要了解其中的10條記錄資訊。此時如果使用索引標識讀取的塊,則可以執行比較少的i/o,資料庫系統會很快找到使用者所需要的內容。而如果沒有使用索引的話,則需要讀取表中所有的塊。
如果在這個表中加入了索引,那麼到底對資料庫的效能影響有多大呢?這個就不好說了,因為其跟很多因素相關。如跟資料選擇性直接相關。如果使用者的資料非常具有選擇性,則表中家功能只有很少的行匹配索引值,則oracle將能夠快速查詢匹配所引值得rowid的索引,並且可以快速查詢少量的相關表快。如還是上面這個表中,其如果儲存有某個市的所有常住人口資訊,其中身份證號碼肯定是少不了的。如此時使用者想根據身份證號碼來查詢某個人的資訊時,那麼資料庫能夠在很短的時間內給出響應。這主要是因為使用者提供的資料非常具有選擇性,基本上跟資料庫中的索引值是一一對應的。而如果使用者想通過出身年月資訊來查詢資訊的話,則其資料庫反映的速度就會比較慢了。
可見索引對資料庫效能的影響直接跟資料的選擇性掛鉤。這對於資料庫管理員設計索引時很有啟發性。如資料庫管理員在設計索引時,最好能夠選擇哪些具有唯一性的字段或者重複性比較少的字段。如此的話,索引對於資料庫效能來說才有比較大的價值。
二、索引效果跟資料庫中記錄的具體儲存位置相關。
還是上面這張表中,如果現在使用者想查詢年齡超過100歲的老人,要對他們去進行慰問。假設現在符合這個條件的人只有10人。那麼此時索引對資料庫效能會有怎麼樣的影響呢?此時顯然資料非常具有選擇性,但是並不一定索引能夠起到很好的效果。這還要看其具體儲存的位置。如果這十條記錄在硬碟中儲存的物理位置比較近,如可能在同乙個扇區之內,則此時索引對於資料庫效能的影響就會比較大,能夠在最短時間內找到符合條件的資料。但是如果相關的行在表中儲存的位置並不互相靠近,則這個索引的效果就會逐漸減少。因為如果匹配索引值的資料分散在硬碟上的多個酷愛時,則必須從表中選擇多個單獨的塊以滿足查詢。
資料庫管理員對於這一點要特別注意。因為此時如果資料庫管理員查用了索引的話,那麼很可能是畫蛇添足。筆者建議,當資料庫管理員發現資料分散在表的多個塊的時候,最好是不要使用索引,而是執行全表掃瞄。此時執行掃瞄反而會比執行索引的效率更高。因為在執行全表掃瞄的時候,oracle資料庫系統會使用多塊讀取以加速掃瞄表。而如果採用索引的話,則其讀取資料時是單塊讀取的。而由於資料儲存在多個塊中,所以其讀取的速度反而會更慢。
由此可見,oracle資料庫管理員在資料庫設計與日常維護中,也要想辦法能夠讓資料盡量儲存在臨近的位置。如儘量減少在同乙個伺服器中不要部署不同的應用服務,防止硬碟產生過多的磁碟碎片;如需要採用多塊硬碟的話,則最好通過表空間把類似的表放在同乙個表空間中,從而讓相關的行在表zhognd儲存位置盡量靠近,以提高索引的使用效果。也就是說,資料庫管理員在使用索引的時候,為表中的字段建立了索引這只是其工作的第一步。在後續資料庫維護與調整的過程中,仍然要注意資料儲存位置對索引的影響。
oracle 索引使用
管理索引 單例索引 單例索引是基於單個列所建立的索引。create index 索引名 on 表名 列名 復合索引 復合索引是基於兩列或是多列建立的索引。create index emp idx1 on emp ename,job creat index emp idx1 on emp job,en...
硬碟使用中的九大誤區揭露
誤區1 多次格式化 硬碟會減短硬碟壽命 簡單的說,格式化硬碟 是絕對不會減短硬碟的使用壽命的。使用者的普遍觀點是,格式化硬碟會導致硬碟使用壽命的降低。其實不然,格式化硬碟不是導致硬碟受損的原因。格式化硬碟的時候,只是對硬碟進行讀寫,而讀寫過程中,磁頭和硬碟磁碟是沒有接觸的,因此不存在破壞磁碟的可能。...
oracle強制索引使用
強制索引格式 select tablename.from tablename table alias where fieldname 說明 index table alias indexname 必須出現在select 之後,字段之前 tablename 為表名,如果sql中表有別名,則必須使用表的...