深入理解Oracle表(6):堆組織表(HOT)和索引組織表(IOT)的區別
最後更新:2018-12-05
來源:互聯網
上載者:User
㈠ HOT和IOT的起源
堆組織表的儲存速度因為不用考慮排序, 所以儲存速度會比較快. 但是要尋找符合某個條件的記錄, 就必須得讀取全部的記錄以便篩選.
而這個時候為了加快查詢速度, 索引就出現了, 索引是針對少量特定欄位的值拿出來進行排序儲存, 並記錄在表中的位置,
而因為索引是有序的, 所以就會很容易通過索引查詢到具體的記錄位置, 然後再根據記錄位置直接從表中讀取該記錄.
同時因為索引的欄位較少, 所以索引通常會比其基表小得多.
從上面通過索引訪問表記錄的方式可以看出, 當要訪問的資料量較大時, 通過每一條記錄的位置去訪問原始記錄,
每一條合格記錄都需要經過索引訪問後再訪問基表這樣一個複雜的過程, 這會花費很多時間,
同樣, 如果不經過索引而直接查詢表, 也可能因為表欄位太多, 記錄較大的情況下把全部的資料讀取進來, 這也會花費很多時間.
那怎麼辦呢?
這個時候就會想到, 如果表中資料本身就是有序的, 這樣查詢表的時候就可以快速的找到合格記錄位置,
而很容易判斷符合條件記錄的位置, 這樣只需要讀取一小部分資料出來就可以了, 不需要全表記錄都讀取出來進行判斷.
索引表就這樣產生了.當然索引表中插入,更新資料的時候可能會因為需要排序而將資料重組, 這時候資料插入或更新速度會比堆組織錶慢一些.
如果堆組織表上有索引, 那麼對堆組織表的插入也會因為要修改索引而變慢
我們可以看到堆組織表+索引的方式 與 索引表 都能夠實現資料的快速尋找, 那為什麼不全部採用索引表呢, 這樣不是很簡單嗎?
我能想到的是前者我們可以針對不同的尋找條件建立多個索引, 而後者卻不行, 後者只能對某一組查詢條件有效.
當然了,索引表上查詢任何記錄都是走索引的, 因為它本身就是索引結構.
當查詢條件不符合指定條件時, 必須走 index full sacn , 需要掃描全部索引.
這就是說這時無法利用索引表已經根據某些欄位排序的事實.也即排序對於這個查詢來說無用.
而符合指定的條件時就會走 index range scan
㈡ 定義
① 堆組織表,其索引中記錄了記錄所在位置的rowid,尋找的時候先找索引,然後再根據索引rowid找到塊中的行資料。索引和表資料是分離的
② 索引組織表,其行資料以索引形式存放,因此找到索引,就等於找到了行資料。索引和資料是在一起的
㈢ 尋找過程
① 堆組織表
一般索引大概3-5層,比如rowid為007,那麼要找到007可能會先從第一層找<1000,再在第二層找到<100
然後在第三層找到007(注意這已經是3次I/O)
接著再通過007中標識的rowid去對應的磁碟上讀取塊中的行資料(第4次I/O)
② 索引組織表
前面的步驟同上,但是找到007後,由於資料和索引在一起,因此不必再找什麼rowid,直接返回結果了