Index的掃描方式:index full scan/index fast full scan

tolywang發表於2010-05-05


進行index full scan的時候 oracle定位到索引的root block,然後到branch block(假如有的話),
再定位到第一個leaf block, 然後根據leaf block的雙向連結串列順序讀取。它所讀取的塊都是有順序的,
也是經過排序的。(Index full scan reads the index data in the order of the data. ),


而index fast full scan則不同,它是從段頭開始,讀取包含點陣圖塊,root block,所有的branch block,
leaf block,讀取的順序完全有物理儲存位置決定,並採取多塊讀,每次讀取db_file_multiblock_read_count
個塊。(Index fast full scan reads the index blocks in the physical order of the blocks) .

另外index fast full scan 用多塊讀的方式來讀取資料塊, index full scan使用單塊讀 

 


對index直接rebuild 和 rebuild online 分別會使用什麼掃描模式呢 ?


rebuild index 和 rebuild index online 探討
當表上的dml操作過多以後表上相應的index可能會變得很稀疏不僅浪費了大量的儲存空間,同時也會造成效能的下降。這時我們就需要對索引進行重建,對於重建有兩種辦法一種是先將old index drop,then create the new index,但是這對於大資料量的表是很費時間的而且在create的時候會阻塞表上的操作(除非create的時候帶上online選項,這時表上的dml會阻塞索引的建立,只有等表上的dml都commit或rollback後索引才會建立完成),在很多生產環境中這是不允許的.第二種方法就是對index進行rebuild,對於rebuild也有兩種選項alter index ind1 rebuild 和 alter index ind1 rebuil online;下面主要討論下rebuild的兩種選項的異同。
   1、alter index ind1 rebuild ;
           這種方法是對已有的索引進行快速全掃描(如果當索引比表本身還大時也會full table scan的。)然後排序(為什麼要排序?這時候Oracle是按照儲存的順序而不是index tree建立的順序讀取,而且索引在儲存時是塊間有序快內無序的。)再寫回索引段,由其原理我們可以得知,這種方法在操作時是不允許對索引進行更改的也就意味著對應的表不能進行dml(查詢不受影響,因原index依然可用)操作。從阻塞表上的操作來講它和drop and create 是一樣的,但其速度要快許多因為它掃描的是索引而不是表。當新索引建立後刪除舊索引。
   2、alter index ind1 rebuild online;
         這種方法是對錶資料進行全表掃描然後建立新的索引,在這個過程中old index 依然可用,因此它不會阻塞表上的dml操作,但其速度很慢。在建立新索引的過程中如果表上發生了dml操作,這些操作對索引的影響會記錄到系統自動建立的JOURNAL TABLE AND INDEX內,等新索引建立完成後JOURNAL TABLE AND INDEX的內容會merge到新索引中,因此rebuild online 也應該在系統不太繁忙的時候進行,不然JOURNAL 表會很大,merge會很費時而merge會鎖表對併發有影響。
由1、2過程可知新索引在建立的時候舊索引依然存在索引這兩中方法在建立時都會需要更多的空間。
測試過程如下:
  22:36:28SQL> alter index text_ind1 rebuild;

索引已更改。

已用時間:  00: 00: 04.20      --才4秒
22:37:05 SQL> alter index text_ind1 rebuild online;

索引已更改。

已用時間:  00: 01: 18.90   --用了一分多鐘
22:39:09 SQL> explain plan set statement_id='offline' for
22:39:36   2  alter index text_ind1 rebuild;
已解釋。
已用時間:  00: 00: 00.00
22:40:47 SQL> select * from table(dbms_xplan.display('plan_table','offline','serial'));
                                                                                                                          
----------------------------------------------------------------------                                                     
| Id  | Operation              |  Name       | Rows  | Bytes | Cost  |                                                     
----------------------------------------------------------------------                                                  
|   0 | ALTER INDEX STATEMENT  |             |       |       |       |                                                       
|   1 |  INDEX BUILD NON UNIQUE| TEXT_IND1   |       |       |       |                                                     
|   2 |   SORT CREATE INDEX    |             |       |       |       |                                                     
|   3 |    INDEX FAST FULL SCAN| TEXT_IND1   |       |       |       |      --索引掃描 
----------------------------------------------------------------------                                                                                                                    
Note: rule based optimization                                                                                                                                                                         已選擇11行。

已用時間:  00: 00: 00.01

22:41:05 SQL> explain plan set statement_id='online' for
22:41:26   2  alter index text_ind1 rebuild online;

已解釋。

已用時間:  00: 00: 00.01
22:41:29 SQL> select * from table(dbms_xplan.display('plan_table','online','serial'));
                                                                                                                             
----------------------------------------------------------------------                                                     
| Id  | Operation              |  Name       | Rows  | Bytes | Cost  |                                                     
----------------------------------------------------------------------                                                     
|   0 | ALTER INDEX STATEMENT  |             |       |       |       |                                                     
|   1 |  INDEX BUILD NON UNIQUE| TEXT_IND1   |       |       |       |                                                     
|   2 |   SORT CREATE INDEX    |             |       |       |       |                                                       
|   3 |    TABLE ACCESS FULL   | TEST        |       |       |       |           --全表掃描                                  
----------------------------------------------------------------------                                                                                                                         
Note: rule based optimization                                                                                                                                                                         已選擇11行。
已用時間:  00: 00: 00.03
22:41:36 SQL> spool off


在另一個session中:

22:36:36 sql>insert into test select * from test where rownum<2;

已建立 1 行。

22:37:05 sql>insert into test select * from test where rownum<2;

已建立 1 行。 
對比執行時間可知rebuild 阻塞了insert操作,而rebuild online 沒有。

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

相關文章