Oracle索引范圍掃描操作流程是什么

本篇內(nèi)容主要講解“Oracle索引范圍掃描操作流程是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Oracle索引范圍掃描操作流程是什么”吧!

創(chuàng)新互聯(lián)是一家專(zhuān)注于成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),修文網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:修文等地區(qū)。修文做網(wǎng)站價(jià)格咨詢(xún):18982081108

索引范圍掃描就是按照根、枝、葉的順序讀取,然后根據(jù)讀取到的滿(mǎn)足條件的數(shù)據(jù)的ROWID回到表中讀取數(shù)據(jù),如果要查詢(xún)的數(shù)據(jù)列包含在索引中那么就免去了回表這步驟。葉塊的地址在枝塊,枝塊地址在根塊。找到枝塊就可以找到葉塊,找到根塊就可以找到枝塊。那么,如何找到根塊呢?

其實(shí)很簡(jiǎn)單,在Oracle中,根塊永遠(yuǎn)在索引段頭的下一個(gè)塊處。因此,索引掃描是不必讀取索引段頭的。先在數(shù)據(jù)字典表中找到段頭位置,塊號(hào)加1就是根塊位置了。
接下來(lái)測(cè)試看看
–創(chuàng)建一個(gè)測(cè)試表

SQL> create table t11 as select *  from dba_objects;
Table created.

–創(chuàng)建索引

SQL> create index ind_t11 on t11(object_id);
Index created.

–收集統(tǒng)計(jì)信息

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

–執(zhí)行一個(gè)簡(jiǎn)單查詢(xún)查看執(zhí)行計(jì)劃

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.

從執(zhí)行計(jì)劃可以看到在索引范圍掃描這一步消耗了3個(gè)邏輯讀,而索引的層高為1,說(shuō)明有兩層
觀察到的邏輯讀為4。這4次邏輯讀分別是:Root塊一次,葉塊兩次,回表讀取數(shù)據(jù)塊一次。
葉塊之所以需要兩次,是因?yàn)樗饕欠俏ㄒ坏?。第一次讀葉塊是為了取出目標(biāo)行ROWID,第二次讀葉塊是判斷此葉塊中還有沒(méi)有滿(mǎn)足條件的行。
如果建成了唯一索引,不需要判斷葉塊是否還有滿(mǎn)足條件的行,葉塊就只需要讀一次,一共只需要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.

到此,相信大家對(duì)“Oracle索引范圍掃描操作流程是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

文章名稱(chēng):Oracle索引范圍掃描操作流程是什么
分享路徑:http://muchs.cn/article46/pdjphg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、建站公司外貿(mào)網(wǎng)站建設(shè)、做網(wǎng)站網(wǎng)站維護(hù)、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司