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某些索引字段時,這種方式的效果更好。
關于這些方面這裡談的很少,後面找個機會單獨讨論。