Oracle堆組織表的索引和索引組織表

tolywang發表於2009-05-08
Oracle堆組織表的索引和索引組織表 : 
 
 
堆組織表,其索引中記錄了資料行所在位置的rowid,查詢的時候先找索引,然後再根據索引rowid找到塊中的行資料。索引和表的資料是分離的 。

索引組織表,其行資料以索引形式存放,因此找到索引,就等於找到了行資料。索引組織表的索引和資料是在一起的 。

 
堆組織表索引查詢過程 -------  
一般索引大概會有3-5層,比如rowid為005,那麼它要找到005可能會先從第一層找<1000的,再在第2層找到<100的,然後第3層找到005(注意,這已經是三次io嘍),然後再透過005中標識的rowid去對應的磁碟上讀取塊中的行資料(第4次io)

索引組織表索引查詢過程 --------
前面的步驟同上,但是找到005後,由於資料與索引在一起,因此不必再找什麼rowid,直接即可返回結果了 

 
 
-----------------------------------------------------------------------------------------------------------
堆組織表的儲存速度因為不用考慮排序, 所以儲存速度會比較快. 但是要查詢符合某個條件的記錄, 就必須得讀取全部的記錄以便篩選.
而這個時候為了加快查詢速度, 索引就出現了, 索引是針對少量特定欄位的值拿出來進行排序儲存, 並記錄在表中的位置,
而因為索引是有序的, 所以就會很容易透過索引查詢到具體的記錄位置, 然後再根據記錄位置直接從表中讀取該記錄.
同時因為索引的欄位較少, 所以索引通常會比其基表小得多.

從上面透過索引訪問表記錄的方式可以看出, 當要訪問的資料量較大時, 透過每一條記錄的位置去訪問原始記錄,
每一條符合條件的記錄都需要經過索引訪問後再訪問基表這樣一個複雜的過程, 這會花費很多時間,
同樣, 如果不經過索引而直接查詢表, 也可能因為表欄位太多, 記錄較大的情況下把全部的資料讀取進來, 這也會花費很多時間.

那怎麼辦呢?
這個時候就會想到, 如果表中資料本身就是有序的, 這樣查詢表的時候就可以快速的找到符合條件的記錄位置,
而很容易判斷符合條件記錄的位置, 這樣只需要讀取一小部分資料出來就可以了, 不需要全表記錄都讀取出來進行判斷.
索引表就這樣產生了.當然索引表中插入,更新資料的時候可能會因為需要排序而將資料重組, 這時候資料插入或更新速度會比堆組織錶慢一些.
如果堆組織表上有索引, 那麼對堆組織表的插入也會因為要修改索引而變慢

我們可以看到堆組織表+索引的方式 與 索引表 都能夠實現資料的快速查詢, 那為什麼不全部採用索引表呢, 這樣不是很簡單嗎?
我能想到的是前者我們可以針對不同的查詢條件建立多個索引, 而後者卻不行, 後者只能對某一組查詢條件有效.
 
 
 
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-604555/,如需轉載,請註明出處,否則將追究法律責任。

相關文章