【Oracle】-【建立索引】-建立索引的操作原理與一些體會

bisal發表於2013-08-09

1、將index key的data讀到cache。如果之前這部分資料未讀到DB Cache,那麼此時可能有db file scatter read write的等待事件。

2、對index key的data進行排序。排序的操作,如果sort_area_size或pga_aggregate_target不大的情況下,可能就會做disk sort,我們知道,磁碟排序的效率要小於Cache不少,因此速度上肯定受影響,會有direct path read/write,同時也會消耗CPU time。

3、建立新的index segment(補充:block是最小的I/O單元,extent是最小的Oracle空間分配單元,segment又是由extent組成的,Oracle中表、索引、檢視等等的儲存都可以看做是segement),將排序的index data寫到建立的index segment中。那麼如果index很大,就會有許多的redo log相關等待,例如log file sync,log buffer space,log file parallel write等。


參考牛人的隨筆後,


關於建立索引的一點體會:

(1)、關於利用並行度建立索引,前提是多個CPU,單CPU下用並行度建立索引,可能會造成資源的爭用,dave曾經推測過可能是CPU的爭用,也可能是I/O的爭用,造成的結果就是比不用並行度消耗更多的時間才能建立索引。

(2)、在建大表的索引時,可以增大PGA,增大temp tablespace,因為排序通常是在PGA中進行的,防止因空間或記憶體不足導致需要disk排序,是最大的問題。但往往有時這些引數不讓隨意調整。那麼nologging這種方式可能還是可以做的。


關於索引利用的一點體會:

(1)、關於第二點,index data都會進行排序,那麼利用索引的這個特性,有時可以避免對錶的排序操作,例如當需要查詢max或min這種排序結果時,只要建立某個欄位的索引,就可以避免order by的使用,因為index中的資料已經排序。

(2)、同時利用索引,有時也可以避免回表,對於select某些索引欄位時,這種方式的效果更好。

關於這些方面這裡談的很少,後面找個機會單獨討論。

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

相關文章