[20170209]索引范围访问2.txt

--ITPUB网友问的问题:

http://www.itpub.net/thread-2083504-1-1.html
--索引范围扫描是如何访问数据块的?
1 FOR  (根节点-> 分支节点->叶节点->表) 这循环吗?
2 还是(根节点-> 分支节点->叶节点->叶节点->叶节点->叶节点->表)?
3 还是 (根节点-> 分支节点->叶节点->表->叶节点->表->叶节点->表->叶节点->表)?

--我认为是3,还是测试来说明问题:

1.环境:
SCOTT@book> @ &r/ver1
PORT_STRING         VERSION        BANNER
------------------- -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

create table t (id number,v1 varchar2(20),v2 varchar2(4000),v3 varchar2(3000));
insert into t as select rownum ,rownum||'aaaa',lpad('a',4000,'a'),lpad('b',3000,'b') from dual connect by level<=200;
commit ;
create unique index i_t_id on t(id) pctfree 80;
--分析略.

SCOTT@book> column PARTITION_NAME noprint
SCOTT@book> select * from dba_extents where file_id=4 and segment_name in ('T','I_T_ID');
OWNER  SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID   BYTES BLOCKS RELATIVE_FNO
------ ------------ ------------ --------------- --------- ------- -------- ------- ------ ------------
SCOTT  I_T_ID       INDEX        USERS                   0       4     1200   65536      8            4
SCOTT  T            TABLE        USERS                   0       4      816   65536      8            4
SCOTT  T            TABLE        USERS                   1       4      824   65536      8            4
SCOTT  T            TABLE        USERS                   2       4      832   65536      8            4
SCOTT  T            TABLE        USERS                   3       4      840   65536      8            4
SCOTT  T            TABLE        USERS                   4       4      848   65536      8            4
SCOTT  T            TABLE        USERS                   5       4      856   65536      8            4
SCOTT  T            TABLE        USERS                   6       4      864   65536      8            4
SCOTT  T            TABLE        USERS                   7       4      872   65536      8            4
SCOTT  T            TABLE        USERS                   8       4      880   65536      8            4
SCOTT  T            TABLE        USERS                   9       4      888   65536      8            4
SCOTT  T            TABLE        USERS                  10       4     1152   65536      8            4
SCOTT  T            TABLE        USERS                  11       4     1160   65536      8            4
SCOTT  T            TABLE        USERS                  12       4     1168   65536      8            4
SCOTT  T            TABLE        USERS                  13       4     1176   65536      8            4
SCOTT  T            TABLE        USERS                  14       4     1184   65536      8            4
SCOTT  T            TABLE        USERS                  15       4     1192   65536      8            4
SCOTT  T            TABLE        USERS                  16       4     1280 1048576    128            4
18 rows selected.

SCOTT@book> select object_name,object_id,data_object_id from dba_objects where owner=user and  object_name in ('T','I_T_ID');
OBJECT_NAME           OBJECT_ID DATA_OBJECT_ID
-------------------- ---------- --------------
I_T_ID                    89842          89842   <==0x15ef2
T                         89841          89841   <==0x15ef1

SCOTT@book> select segment_name,header_file,header_block from dba_segments where segment_name in ('T','I_T_ID');
SEGMENT_NAME         HEADER_FILE HEADER_BLOCK
-------------------- ----------- ------------
T                              4          818
I_T_ID                         4         1202

--这样基本1条记录1块.

SCOTT@book> alter session set events 'immediate trace name treedump level 89842';
Session altered.

*** 2017-02-09 15:02:47.723
branch: 0x10004b3 16778419 (0: nrow: 2, level: 1)          => dba=4,1203
   leaf: 0x10004b4 16778420 (-1: nrow: 111 rrow: 111)      => dba=4,1204
   leaf: 0x10004b5 16778421 (0: nrow: 89 rrow: 89)         => dba=4,1205
----- end tree dump
--//索引记录分部在2块.

2.测试:
SCOTT@book> alter session set statistics_level=all;
Session altered.

SCOTT@book> show arraysize
arraysize 200

SCOTT@book> select /*+ index( t i_t_id ) */ id,v1 from t where id between 101 and 120;
ID V1
--- --------------------
101 101aaaa
102 102aaaa
103 103aaaa
104 104aaaa
105 105aaaa
106 106aaaa
107 107aaaa
108 108aaaa
109 109aaaa
110 110aaaa
111 111aaaa
112 112aaaa
113 113aaaa
114 114aaaa
115 115aaaa
116 116aaaa
117 117aaaa
118 118aaaa
119 119aaaa
120 120aaaa
20 rows selected.

SCOTT@book> @ &r/dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  cx4u60mg16ksy, child number 0
-------------------------------------
select /*+ index( t i_t_id ) */ id,v1 from t where id between 101 and 120
Plan hash value: 4153437776
--------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |      1 |        |       |    24 (100)|          |     20 |00:00:00.01 |      24 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T      |      1 |     21 |   252 |    24   (0)| 00:00:01 |     20 |00:00:00.01 |      24 |
|*  2 |   INDEX RANGE SCAN          | I_T_ID |      1 |     21 |       |     2   (0)| 00:00:01 |     20 |00:00:00.01 |       4 |
--------------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1 / T@SEL$1
   2 - SEL$1 / T@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("ID">=101 AND "ID"<=120)
26 rows selected.
--//逻辑读是24. (arraysize=200)

SCOTT@book> set array 2
SCOTT@book> select /*+ index( t i_t_id ) */ id,v1 from t where id between 101 and 120;
...
Plan hash value: 4153437776
--------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |      1 |        |       |    24 (100)|          |     20 |00:00:00.01 |      32 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T      |      1 |     21 |   252 |    24   (0)| 00:00:01 |     20 |00:00:00.01 |      32 |
|*  2 |   INDEX RANGE SCAN          | I_T_ID |      1 |     21 |       |     2   (0)| 00:00:01 |     20 |00:00:00.01 |      12 |
--------------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1 / T@SEL$1
   2 - SEL$1 / T@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("ID">=101 AND "ID"<=120)
--//逻辑读是24. (arraysize=2)

3.跟踪看看:
--//如何跟踪逻辑读,想了N久才想起来10200事件.
$ oerr ora 10200
10200, 00000, "consistent read buffer status"
// *Cause:
// *Action:

SCOTT@book> ALTER SESSION SET EVENTS '10200 TRACE NAME CONTEXT FOREVER, LEVEL 1';
Session altered.

SCOTT@book> select /*+ index( t i_t_id ) */ id,v1 from t where id between 101 and 120;
        ID V1
---------- --------------------
       101 101aaaa
...
       120 120aaaa

20 rows selected.

SCOTT@book> ALTER SESSION SET EVENTS '10200 TRACE NAME CONTEXT OFF';
Session altered.

--//检查转储:
ktrgtc2(): started for block <0x0004 : 0x010004b3> objd: 0x00015ef2
  env [0x7fadbb8f6fdc]: (scn: 0x0003.175073c2  xid: 0x0000.000.00000000  uba: 0x00000000.0000.00  statement num=0  parent xid: 0x0000.000.00000000  st-scn: 0x0000.00000000  hi-scn: 0x0000.00000000  ma-scn: 0x0003.1750734b  flg: 0x00000661)
ktrexc(): returning 2 on:  0xc0f4928  cr-scn: 0xffff.ffffffff  xid: 0x0000.000.00000000  uba: 0x00000000.0000.00  cl-scn: 0xffff.ffffffff  sfl: 0
ktrgtc2(): completed for block <0x0004 : 0x010004b3> objd: 0x00015ef2
ktrget2(): started for block  <0x0004 : 0x010004b4> objd: 0x00015ef2
env [0x7fadbb8f6fdc]: (scn: 0x0003.175073c2  xid: 0x0000.000.00000000  uba: 0x00000000.0000.00  statement num=0  parent xid: 0x0000.000.00000000  st-scn: 0x0000.00000000  hi-scn: 0x0000.00000000  ma-scn: 0x0003.1750734b  flg: 0x00000660)
ktrexf(): returning 9 on:  0xc0f4928  cr-scn: 0xffff.ffffffff  xid: 0x0000.000.00000000  uba: 0x00000000.0000.00  cl-scn: 0xffff.ffffffff  sfl: 0
ktrgcm(): completed for block  <0x0004 : 0x010004b4> objd: 0x00015ef2
ktrget3(): completed for  block <0x0004 : 0x010004b4> objd: 0x00015ef2
ktrget2(): started for block  <0x0004 : 0x0100049f> objd: 0x00015ef1

$ grep "started" /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_53991.trc|wc
     32     288    2207
--//正好对上.

$ grep "started" /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_53991.trc
ktrgtc2(): started for block <0x0004 : 0x010004b3> objd:  0x00015ef2    <= dba=4,1203,索引的根节点块
ktrget2(): started for block  <0x0004 : 0x010004b4> objd: 0x00015ef2    <= dba=4,1204,索引的叶子块
ktrget2(): started for block  <0x0004 : 0x0100049f> objd: 0x00015ef1    <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004b4> objd: 0x00015ef2    <= dba=4,1204,索引的叶子块
ktrget2(): started for block  <0x0004 : 0x01000498> objd: 0x00015ef1    <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x01000499> objd: 0x00015ef1    <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004b4> objd: 0x00015ef2    <= dba=4,1204,索引的叶子块
ktrget2(): started for block  <0x0004 : 0x010004a6> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x010004a7> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x010004b4> objd: 0x00015ef2
ktrget2(): started for block  <0x0004 : 0x010004a1> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x010004a4> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x010004b4> objd: 0x00015ef2
ktrget2(): started for block  <0x0004 : 0x010004a5> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x010004a2> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x010004b4> objd: 0x00015ef2
ktrget2(): started for block  <0x0004 : 0x010004a3> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x010004aa> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x010004b5> objd: 0x00015ef2
ktrget2(): started for block  <0x0004 : 0x010004ab> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x010004ac> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x010004b5> objd: 0x00015ef2
ktrget2(): started for block  <0x0004 : 0x010004ad> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x010004ae> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x010004b5> objd: 0x00015ef2
ktrget2(): started for block  <0x0004 : 0x010004af> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x010004a8> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x010004b5> objd: 0x00015ef2
ktrget2(): started for block  <0x0004 : 0x010004a9> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x0100055a> objd: 0x00015ef1
ktrget2(): started for block  <0x0004 : 0x010004b5> objd: 0x00015ef2
ktrget2(): started for block  <0x0004 : 0x0100055e> objd: 0x00015ef1

--//仔细看后面的规律都是
--//先访问0x00015ef2对象一次,再访问0x00015ef1对象2次.我注解在后面.
--//你可以注意一个小细节,第一次读表是读一条记录.可以看看我以前写的帖子:
http://blog.itpub.net/267265/viewspace-1430902/

--//设置为3重复测试看看.
SCOTT@book> set array 3
SCOTT@book> ALTER SESSION SET EVENTS '10200 TRACE NAME CONTEXT FOREVER, LEVEL 1';
SCOTT@book> select /*+ index( t i_t_id ) */ id,v1 from t where id between 101 and 120;
Plan hash value: 4153437776
--------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |      1 |        |       |    24 (100)|          |     20 |00:00:00.01 |      30 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T      |      1 |     21 |   252 |    24   (0)| 00:00:01 |     20 |00:00:00.01 |      30 |
|*  2 |   INDEX RANGE SCAN          | I_T_ID |      1 |     21 |       |     2   (0)| 00:00:01 |     20 |00:00:00.01 |      10 |
--------------------------------------------------------------------------------------------------------------------------------
SCOTT@book> ALTER SESSION SET EVENTS '10200 TRACE NAME CONTEXT OFF';

$ grep "started" /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_54066.trc|wc
     30     270    2069
--//也执行计划看到的逻辑读一致.

$ grep "started" /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_54066.trc
ktrgtc2(): started for block <0x0004 : 0x010004b3> objd: 0x00015ef2       <= dba=4,1203,索引的根节点块
ktrget2(): started for block  <0x0004 : 0x010004b4> objd: 0x00015ef2      <= dba=4,1204,索引的叶子块
ktrget2(): started for block  <0x0004 : 0x0100049f> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004b4> objd: 0x00015ef2      <= dba=4,1204,索引的叶子块
ktrget2(): started for block  <0x0004 : 0x01000498> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x01000499> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004a6> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004b4> objd: 0x00015ef2      <= dba=4,1204,索引的叶子块
ktrget2(): started for block  <0x0004 : 0x010004a7> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004a1> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004a4> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004b4> objd: 0x00015ef2      <= dba=4,1204,索引的叶子块
ktrget2(): started for block  <0x0004 : 0x010004a5> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004a2> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004a3> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004b4> objd: 0x00015ef2      <= dba=4,1204,索引的叶子块
ktrget2(): started for block  <0x0004 : 0x010004aa> objd: 0x00015ef1      <= 读表段一条记录 ,注意这里仅仅剩下1条记录. 也就是前面分支仅仅11个键值.
ktrget2(): started for block  <0x0004 : 0x010004b5> objd: 0x00015ef2      <= dba=4,1205,索引的叶子块
ktrget2(): started for block  <0x0004 : 0x010004ab> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004ac> objd: 0x00015ef1      <= 读表段一条记录,注意这里仅仅访问2条,因为arraysize=3.
ktrget2(): started for block  <0x0004 : 0x010004b5> objd: 0x00015ef2      <= dba=4,1205,索引的叶子块
ktrget2(): started for block  <0x0004 : 0x010004ad> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004ae> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004af> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004b5> objd: 0x00015ef2      <= dba=4,1205,索引的叶子块
ktrget2(): started for block  <0x0004 : 0x010004a8> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004a9> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x0100055a> objd: 0x00015ef1      <= 读表段一条记录
ktrget2(): started for block  <0x0004 : 0x010004b5> objd: 0x00015ef2      <= dba=4,1205,索引的叶子块
ktrget2(): started for block  <0x0004 : 0x0100055e> objd: 0x00015ef1      <= 读表段一条记录

[20170209]索引范围访问2.txt相关推荐

  1. R语言使用多个数据类型不同的向量数据创建一个dataframe数据对象、使用[]操作符和列索引数值访问dataframe指定数据列的数据(column index)

    R语言使用多个数据类型不同的向量数据创建一个dataframe数据对象.使用[]操作符和列索引数值访问dataframe指定数据列的数据(column index) 目录 R语言使用多个数据类型不同的 ...

  2. R语言向量vector数据类型元素索引、访问:使用length函数计算向量的长度、元素个数

    R语言向量vector数据类型元素索引.访问:使用length函数计算向量的长度.元素个数 目录 R语言向量vector数据类型元素索引.访问:使用length函数计算向量的长度.元素个数 R 语言特 ...

  3. python 中pandask的 iterrows、itertuples、iteritems的理解及遍历,用‘列名’和‘索引’方式访问,及速度比拼

    目录 一.iterrows 方法遍历 DataFrame 二.itertuples() 方式遍历DataFrame: 三  iteritems 旧方法和新方法方法 遍历 DataFrame 四.速度  ...

  4. lucene索引word/pdf/html/txt文件及检索(搜索引擎)

    2009-07-02 15:31 因为lucene索引的时候是将String型的信息建立索引的,所以这里必须是将word/pdf/html等文件的内容转化问字符型. lucene的jar包自己去下载. ...

  5. python将列表的第一列删除_python列表基本操作:索引(访问),切片,扩展,删除,追加,统计,长度,获取下标等...

    List(列表) 列表,是一种用于保存一系列有序项目的集合,在 Python 中你需要在它们之间加上一个逗号 注意:列表是可变数据类型 列表的基本操作有:索引(访问),切片,扩展,删除,追加,统计,长 ...

  6. 智能文档控制——文档的智能归档、捕获、索引、访问和协作

    Smart Document Control 一.杜绝成堆的文件和文件混乱,保证业务连续性,创建企业新阶段 清晰有条理和即时可用的信息是成功的业务流程的关键.随时随地安全管理业务文档,快速查找并智能使 ...

  7. python中字符串索引_Python字符串的索引与访问字符串中的字符

    字符串是Python中一种非常重要的数据类型.Python字符串是字符的集合,是由单引号.双引号或三引号包裹起来的若干字符的序列.Python字符串中的每个字符使用ASCII或Unicode字符编码, ...

  8. java检索txt文本_lucene索引word/pdf/html/txt文件及检索(搜索引擎)

    publicclassTestQuery {publicstaticvoidmain(String[] args)throwsIOException, ParseException { Hits hi ...

  9. 利用PHP编程生成蜘蛛访问记录txt文档

    分享一个PHP版本的蜘蛛统计代码,只需要加到你的index文件内即可实现蜘蛛统计! 统计结果会在根目录生成bot.txt文本 1.统计效果 2.PHP实现代码 $useragent = addslas ...

  10. 试编写程序,随机生成三个0-2范围内的整数,将其作为索引分别访问三个列表中的对应元素,然后进行造句。 例如,随机生成三个整数分别为1,0,2,则输出句子“小羊在草地上吃晚饭”。

    1.代码 代码如下: import randomlst_who = ["小马", "小羊", "小鹿"] lst_where = [&quo ...

最新文章

  1. LightOJ - 1098 A New Function
  2. 使用verilog实现基于FPGA的TDC设计
  3. 20220130---CTF WEB方向刷题WP-----网页初始index.php/robots.txt
  4. java clob存储_java oracle clob string 大字符串存储
  5. (转)阿里云CentOS 7下配置及使用mysql
  6. PHP学习笔记:利用百度api实现手机归属地查询
  7. C# 委托?这篇文章让你困惑全摆脱!
  8. L3-009 长城 (30 分)-PAT 团体程序设计天梯赛 GPLT
  9. ASP.NET MVC 5– 使用Wijmo MVC 5模板1分钟创建应用
  10. linux系统安装coerplayer,安装deepin~
  11. 三列自适应布局(圣杯布局)
  12. 计算机xp画板在哪找,xp画图工具 xp画图工具在哪里 | 帮助信息-动天数据
  13. 高效率完成一次接入80个手游渠道SDK——游戏接入SDK服务端篇
  14. k8s pod 污点
  15. 通过X11转发在服务器上用IGV
  16. 大数据之Hadoop生态系统概述
  17. 电影《不夜城》的主题曲:金城武、山本未来主演
  18. 《MLB棒球创造营》:走近棒球运动·亚利桑那响尾蛇队
  19. 云呐|固定资产条码管理系统的应用实例
  20. 三、Hive数据仓库应用之Hive数据操作语言(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7)

热门文章

  1. 语音转写和语音听写_如何在Windows 10上使用语音听写
  2. netty 原理分析
  3. 宁波大学计算机网络复试真题,宁波大学计算机网络习题集
  4. KMSpico 无后门下载
  5. slk文件转换器安卓版_MP3提取转换器
  6. uRPF Unicast Reverse Path Forwarding
  7. git 拉取代码库的项目到本地(window系统)
  8. SuiteCRM图片上传(自定义控制器)
  9. QTreeView三态复选
  10. 微信公众号全局返回码