您好,登錄后才能下訂單哦!
本篇內容主要講解“Oracle索引范圍掃描操作流程是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Oracle索引范圍掃描操作流程是什么”吧!
索引范圍掃描就是按照根、枝、葉的順序讀取,然后根據讀取到的滿足條件的數據的ROWID回到表中讀取數據,如果要查詢的數據列包含在索引中那么就免去了回表這步驟。葉塊的地址在枝塊,枝塊地址在根塊。找到枝塊就可以找到葉塊,找到根塊就可以找到枝塊。那么,如何找到根塊呢?
其實很簡單,在Oracle中,根塊永遠在索引段頭的下一個塊處。因此,索引掃描是不必讀取索引段頭的。先在數據字典表中找到段頭位置,塊號加1就是根塊位置了。
接下來測試看看
–創建一個測試表
SQL> create table t11 as select * from dba_objects; Table created.
–創建索引
SQL> create index ind_t11 on t11(object_id); Index created.
–收集統計信息
SQL> exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'T11',estimate_percent=>100,cascade=>true,method_opt=>'for all columns size auto',no_invalidate=>false); PL/SQL procedure successfully completed.
–查看索引信息
SQL> select table_name,index_name,blevel,index_type,leaf_blocks from dba_indexes where index_name='IND_T11' and table_name='T11'; TABLE_NAME INDEX_NAME BLEVEL INDEX_TYPE LEAF_BLOCKS ------------------------------ ------------------------------ ---------- --------------------------- ----------- T11 IND_T11 1 NORMAL 161
–執行一個簡單查詢查看執行計劃
SQL> select * from table(dbms_xplan.display_cursor('','','allstats last')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SQL_ID g7411gwcvppnd, child number 0 ------------------------------------- select * from t11 where object_id=11 Plan hash value: 469757982 ------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | ------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 4 | | 1 | TABLE ACCESS BY INDEX ROWID| T11 | 1 | 1 | 1 |00:00:00.01 | 4 | |* 2 | INDEX RANGE SCAN | IND_T11 | 1 | 1 | 1 |00:00:00.01 | 3 | ------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("OBJECT_ID"=11) 19 rows selected.
從執行計劃可以看到在索引范圍掃描這一步消耗了3個邏輯讀,而索引的層高為1,說明有兩層
觀察到的邏輯讀為4。這4次邏輯讀分別是:Root塊一次,葉塊兩次,回表讀取數據塊一次。
葉塊之所以需要兩次,是因為索引是非唯一的。第一次讀葉塊是為了取出目標行ROWID,第二次讀葉塊是判斷此葉塊中還有沒有滿足條件的行。
如果建成了唯一索引,不需要判斷葉塊是否還有滿足條件的行,葉塊就只需要讀一次,一共只需要3次邏輯讀。
drop index ind_t11; SQL> drop index ind_t11; Index dropped. create unique index ind_t11_1 on t11(object_id); SQL> create unique index ind_t11_1 on t11(object_id); Index created. select * from t11 where object_id=11; SQL> select * from table(dbms_xplan.display_cursor('','','allstats last')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SQL_ID g7411gwcvppnd, child number 0 ------------------------------------- select * from t11 where object_id=11 Plan hash value: 645999193 ------------------------------------------------------------------------------------------------------------ | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | ------------------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 3 | 4 | | 1 | TABLE ACCESS BY INDEX ROWID| T11 | 1 | 1 | 1 |00:00:00.01 | 3 | 4 | |* 2 | INDEX UNIQUE SCAN | IND_T11_1 | 1 | 1 | 1 |00:00:00.01 | 2 | 4 | ------------------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("OBJECT_ID"=11) 19 rows selected.
到此,相信大家對“Oracle索引范圍掃描操作流程是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。