當(dāng)我們創(chuàng)建索引時(shí),oracle會(huì)為索引創(chuàng)建索引樹(shù),表和索引樹(shù)通過(guò)rowid(偽列)來(lái)定位數(shù)據(jù).
當(dāng)表里的數(shù)據(jù)發(fā)生更新時(shí),oracle會(huì)自動(dòng)維護(hù)索引樹(shù).但是在索引樹(shù)中沒(méi)有更新操作,只有刪除和插入操作。
例如在某表id列上創(chuàng)建索引,某表id列上有值“101”,當(dāng)我將“101”更新為“110”時(shí),oracle同時(shí)會(huì)來(lái)更新索引樹(shù),但是oracle先將索引樹(shù)中的“101”標(biāo)示為刪除(實(shí)際并未刪除,只是標(biāo)示一下),然后再將“110”寫(xiě)到索引樹(shù)中.
如果表更新比較頻繁,那么在索引中刪除標(biāo)示會(huì)越來(lái)越多,這時(shí)索引的查詢效率必然降低,所以我們應(yīng)該定期重建索引來(lái)消除索引中這些刪除標(biāo)記.
一般不會(huì)選擇先刪除索引,然后再重新創(chuàng)建索引,而是rebuild索引.在rebuild期間,用戶還可以使用原來(lái)的索引,并且rebuild新的索引時(shí)也會(huì)利用原來(lái)的索引信息,這樣重建索引會(huì)塊一些.