Index的掃描方式:index full scan/index fast full scan
進行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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- INDEX UNIQUE SCAN,INDEX FULL SCAN和INDEX FAST FULL SCANIndexAST
- Index Full Scan vs Index Fast Full ScanIndexAST
- Index Full Scan 與 Index Fast Full ScanIndexAST
- rowid,index,INDEX FULL SCAN,INDEX FAST FULL SCAN|IndexAST
- INDEX FULL SCAN和INDEX FAST FULL SCAN區別IndexAST
- index full scan 和 index FAST full scan 區別IndexAST
- Index Full Scan 與 Index Fast Full Scan (Final)IndexAST
- INDEX FULL SCAN和INDEX FAST FULL SCAN的區別IndexAST
- index full scan 和 index fast full scan (IFS,FFS)的不同IndexAST
- index range scan,index fast full scan,index skip scan發生的條件IndexAST
- Index Full Scan和Index Fast Full Scan行為差異分析(上)IndexAST
- Index Full Scan和Index Fast Full Scan行為差異分析(下)IndexAST
- index fast full scan 和 nullIndexASTNull
- Fast full index scan 淺析ASTIndex
- (轉)索引掃描還是全表掃描(Index Scan Or Full Table Scan)索引Index
- 轉)索引掃描還是全表掃描(Index Scan Or Full Table Scan)索引Index
- [總結]關於index range scans & INDEX (FAST FULL SCAN)IndexAST
- 收集full table / index scan sqlIndexSQL
- SELECT COUNT(*) 索引會走 index fast full scan索引IndexAST
- Index Full Scans和Index Fast Full ScansIndexAST
- index fast full scan不能使用並行的實驗IndexAST並行
- FBI? MAX? INDEX FULL SCAN (MIN/MAX)?Index
- MYSQL 中的GROUP BY 的方式 (1)(loose index scan鬆散掃描 tight index scan緊湊掃描)MySqlIndex
- oracle實驗記錄(INDEX fast full scan 的成本計算)OracleIndexAST
- 【優化】INDEX FULL SCAN (MIN/MAX)訪問路徑優化Index
- Fast Full Index Scans的特點!ASTIndex
- 【最佳化】INDEX FULL SCAN (MIN/MAX)訪問路徑Index
- 索引唯一性掃描(INDEX UNIQUE SCAN)索引Index
- 【TUNE_ORACLE】列出走了INDEX FULL SCAN的SQL參考OracleIndexSQL
- Clustered Index Scan and Clustered Index SeekIndex
- 跳躍式索引掃描(index skip scan) [final]索引Index
- INDEX SKIP SCANIndex
- 理解index skip scanIndex
- Index Unique Scan (213)Index
- 【INDEX_SS】使用HINT使SQL用索引跳躍掃描(Index Skip Scan)方式快速獲取資料IndexSQL索引
- 20180316不使用INDEX FULL SCAN (MIN/MAX)Index
- PostgreSQL DBA(119) - pgAdmin(LIMIT:Index Scan vs Bitmap Index Scan)SQLMITIndex
- [轉貼]Skip Scan IndexIndex