Oracle索引范围扫描操作流程是什么

技术Oracle索引范围扫描操作流程是什么本篇内容主要讲解“Oracle索引范围扫描操作流程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle索引范围扫描操作流

本文主要讲解“Oracle索引范围扫描的操作流程是什么”。感兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。让边肖带你学习“Oracle索引范围扫描的操作流程是什么”!

索引扫描是按照根、枝、叶的顺序读取,然后根据符合条件的数据的ROWID返回表中读取数据。如果要查询的数据列包含在索引中,则省略返回表的步骤。叶地址在分支块中,分支块地址在根块中。如果找到分支块,就可以找到叶块;如果找到根块,就可以找到分支块。那么,如何找到根块呢?

实际上很简单,在Oracle中,根块总是在索引段头的下一个块。因此,索引扫描不需要读取索引段头。首先在数据字典表中找到段头位置,块号加1就是根块位置。

接下来我们来测试一下。

创建测试表。

SQLcreatetablet11asselect从dba_objects中选择*;

已创建。创建索引。

SQLcreateindexind _ t11 ont 11(object _ id);

索引已创建。收集统计数据。

sqlexedcbms _ stats . gather _ table _ stats(own name=' SCOTT ',tabname='T11 ',estimate_percent=100,cascade=true,method _ opt=' for llcolumnsizeauto ',no _ invalidate=false);

pl/sqlprocedrecessfully completed。查看索引信息。

SQLselecttable_name,index_name,blevel,index_type,leaf _ blocksfromdba _ indexes where index _ name=' IND _ T11 '和andtable _ name=' T11

表_名称索引_名称索引_类型叶_块

-

t11 ind _ t111 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索引范围扫描操作流程是什么”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/68681.html

(0)

相关推荐

  • 如何分析ASM中的Extent

    技术如何分析ASM中的Extent本篇文章为大家展示了如何分析ASM中的Extent,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。ASM中分配空间的单位是AU,Extent包含1

    攻略 2021年11月30日
  • swing客户端设置(哪些是swing的界面组件)

    技术Swing客户端的知识有哪些这篇文章将为大家详细讲解有关Swing客户端的知识有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.简介Jakarta Struts

    攻略 2021年12月18日
  • 南辕北辙原文及翻译,《南辕北辙》的古文意思和寓意

    技术南辕北辙原文及翻译,《南辕北辙》的古文意思和寓意1南辕北辙原文及翻译、《南辕北辙》的古文意思如下:
    我今天来上朝的时候,在大路上遇见了一个人,正在面朝北面驾着他的车,他告诉我说:‘我想到楚国去。’我说:‘您到楚国去,

    生活 2021年10月23日
  • 发朋友圈文字怎么不被折叠,苹果手机朋友圈折叠怎么处理

    技术发朋友圈文字怎么不被折叠,苹果手机朋友圈折叠怎么处理下载安装“讯飞输入法”,进入输入状态,点击“快捷输入”图标,进入“剪贴板”页面发朋友圈文字怎么不被折叠。打开“朋友圈模式”,需要开启完全访问状态,点击“立即开启”。

    生活 2021年10月30日
  • vue中怎么使用vue-cropper裁剪图片

    技术vue中怎么使用vue-cropper裁剪图片这篇文章主要讲解了“vue中怎么使用vue-cropper裁剪图片”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue中

    攻略 2021年11月24日
  • web边框设置弧形(网页中一竖杠怎么设计渐变)

    技术web中怎么用线性渐变实现斜线这篇文章主要介绍“web中怎么用线性渐变实现斜线”,在日常操作中,相信很多人在web中怎么用线性渐变实现斜线问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”

    攻略 2021年12月22日