【基础篇索引】索引基础(一)

最近有同事问了下索引的相关问题,这块也是计划要总结的,内容挺多的,先简单开个头,泛泛而谈,然后再深入和扩展。

先创建一个unique索引:

SQL> select count(*) from t_policy a;

 

  COUNT(*)

----------

   5025491

 

create tablespace testindex datafile '/tpdata/database/oradata/test1/index.dbf' size 1000M;

create unique index ind_policy_id on t_policy(policy_id) tablespace testindex;

 

创建完成后,可以在all_indexes中查询索引的相关信息:

SQL> select a.index_name,

  2         a.index_type,

  3         a.uniqueness,

  4         a.blevel,

  5         a.leaf_blocks,

  6         a.distinct_keys,

  7         a.avg_leaf_blocks_per_key,

  8         a.avg_data_blocks_per_key,

  9         a.buffer_pool

 10    from all_indexes a

 11   where a.index_name = upper('ind_policy_id');

 

INDEX_NAME                     INDEX_TYPE                  UNIQUENESS     BLEVEL LEAF_BLOCKS DISTINCT_KEYS AVG_LEAF_BLOCKS_PER_KEY AVG_DATA_BLOCKS_PER_KEY BUFFER_POOL

------------------------------ --------------------------- ---------- ---------- ----------- ------------- ----------------------- ----------------------- -----------

IND_POLICY_ID                  NORMAL                      UNIQUE              2       11195       5025491                       1                       1 DEFAULT

 

SQL>

 

上面列举了索引的一些重要的信息,索引类型唯一性二元高度叶块数,distinct键值,平均每个键值的叶块数量,平均每个键值的数据块数量,设置的buffer_pool缓冲池,这里暂时列出,后续将结合实验详细描述。

 

再来看看dba_segments中的段信息,主要看看段的header所在文件编号,headerblock编号,段包含的block数量和extents数量,可以利用这里得到的信息转储header block,并能从header block中找到相应的信息。后面即有对header blockleaf block的转储。

SQL> select a.header_file,

  2         a.header_block,

  3         a.bytes,

  4         a.blocks,

  5         a.extents,

  6         a.segment_name

  7    from dba_segments a

  8   where a.segment_name = upper('ind_policy_id');

 

HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS    EXTENTS SEGMENT_NAME

----------- ------------ ---------- ---------- ---------- ---------------

         10           11  100663296      12288         83 IND_POLICY_ID

 

SQL>

 

从上面的查询中已经看到这个索引段一共包含了83extents,选择性的来看其中的一些extent_id对应的block_id,可以看出每个extent分配的block数量是不同的,但是还是有一些规律,后面的dump file中可以详细的看到。

SQL> select segment_name, file_id, extent_id, block_id

  2    from dba_extents

  3   where segment_name = 'IND_POLICY_ID'

  4     and extent_id + 1 in (1, 16, 17, 18, 79, 80, 81, 83);

 

SEGMENT_NAME             FILE_ID  EXTENT_ID   BLOCK_ID

------------------------ ---------- ----------

IND_POLICY_ID            10          0          9

IND_POLICY_ID            10         15        129

IND_POLICY_ID            10         16        137

IND_POLICY_ID            10         17        265

IND_POLICY_ID            10         78       8073

IND_POLICY_ID            10         79       8201

IND_POLICY_ID            10         80       9225

IND_POLICY_ID            10         82      11273

 

8 rows selected

 

 

SQL> alter system dump datafile 10 block 11;

 

System altered

[oracle@limmTest admin]$ vi /tpdata/database/admin/test1/udump/test1_ora_1763.trc

 

/tpdata/database/admin/test1/udump/test1_ora_1763.trc

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

ORACLE_HOME = /tpsys/oracle/product/10.2.0/db_1

System name:    Linux

Node name:      limmTest

Release:        2.6.18-53.el5

Version:        #1 SMP Wed Oct 10 16:34:02 EDT 2007

Machine:        i686

Instance name: test1

Redo thread mounted by this instance: 1

Oracle process number: 21

Unix process pid: 1763, image: oracle@limmTest

 

*** 2010-07-08 03:26:30.194

*** ACTION NAME:(SQL Window - 驴驴.sql) 2010-07-08 03:26:30.191

*** MODULE NAME:(PL/SQL Developer) 2010-07-08 03:26:30.191

*** SERVICE NAME:(test1) 2010-07-08 03:26:30.191

*** SESSION ID:(136.208) 2010-07-08 03:26:30.191

Start dump data blocks tsn: 10 file#: 10 minblk 11 maxblk 11

buffer tsn: 10 rdba: 0x0280000b (10/11)

scn: 0x05d9.8cd2c199 seq: 0x02 flg: 0x04 tail: 0xc1992302

frmt: 0x02 chkval: 0xc599 type: 0x23=PAGETABLE SEGMENT HEADER

Hex dump of block: st=0, typ_found=1

Dump of memory from 0xB77EAC00 to 0xB77ECC00

B77EAC00 0000A223 0280000B 8CD2C199 040205D9  [#...............]

…….

B77ECBF0 00000000 00000000 00000000 C1992302  [.............#..]

  Extent Control Header

  -----------------------------------------------------------------

  Extent Header:: spare1: 0      spare2: 0      #extents: 83     #blocks: 12288

                  last map  0x00000000  #maps: 0      offset: 2716

      Highwater::  0x02802c6d  ext#: 82     blk#: 100    ext size: 1024

  #blocks in seg. hdr's freelists: 0

  #blocks below: 11364

  mapblk  0x00000000  offset: 82

                   Unlocked

  --------------------------------------------------------

  Low HighWater Mark :

      Highwater::  0x02802c6d  ext#: 82     blk#: 100    ext size: 1024

  #blocks in seg. hdr's freelists: 0

  #blocks below: 11364

  mapblk  0x00000000  offset: 82

  Level 1 BMB for High HWM block: 0x02802c09

  Level 1 BMB for Low HWM block: 0x02802c09

  --------------------------------------------------------

  Segment Type: 2 nl2: 1      blksz: 8192   fbsz: 0

  L2 Array start offset:  0x00001434

  First Level 3 BMB:  0x00000000

  L2 Hint for inserts:  0x0280000a

  Last Level 1 BMB:  0x02802c0c

  Last Level II BMB:  0x0280000a

  Last Level III BMB:  0x00000000

     Map Header:: next  0x00000000  #extents: 83   obj#: 64411  flag: 0x10000000

  Inc # 0

  Extent Map

  -----------------------------------------------------------------

   0x02800009  length: 8

 …..

   0x02802c09  length: 1024

 

  Auxillary Map

  --------------------------------------------------------

   Extent 0     :  L1 dba:  0x02800009 Data dba:  0x0280000c

  …..

   Extent 82    :  L1 dba:  0x02802c09 Data dba:  0x02802c0d

  --------------------------------------------------------

 

   Second Level Bitmap block DBAs

   --------------------------------------------------------

   DBA 1:   0x0280000a

 

End dump data blocks tsn: 10 file#: 10 minblk 11 maxblk 11

 

extent map中可以看出来总共有83segments,所包含的blocks分别是                                                            

SQL> select 16*8+1024*4+63*128 from dual;

 

16*8+1024*4+63*128

------------------

             12288

这与dba_segments中的相关字段信息相对应:

SQL> select a.blocks,a.extents from dba_segments a where a.segment_name = 'IND_POLICY_ID';

 

    BLOCKS    EXTENTS

---------- ----------

     12288         83


下面是对一个leaf block的转储,此外还有branch block

/tpdata/database/admin/test1/udump/test1_ora_4568.trc

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

ORACLE_HOME = /tpsys/oracle/product/10.2.0/db_1

System name:    Linux

Node name:      limmTest

Release:        2.6.18-53.el5

Version:        #1 SMP Wed Oct 10 16:34:02 EDT 2007

Machine:        i686

Instance name: test1

Redo thread mounted by this instance: 1

Oracle process number: 25

Unix process pid: 4568, image: oracle@limmTest

 

*** ACTION NAME:(Command Window - New) 2010-07-08 03:36:40.315

*** MODULE NAME:(PL/SQL Developer) 2010-07-08 03:36:40.315

*** SERVICE NAME:(test1) 2010-07-08 03:36:40.315

*** SESSION ID:(138.5152) 2010-07-08 03:36:40.315

Start dump data blocks tsn: 10 file#: 10 minblk 14 maxblk 14

buffer tsn: 10 rdba: 0x0280000e (10/14)

scn: 0x05d9.8cd2c049 seq: 0x02 flg: 0x04 tail: 0xc0490602

frmt: 0x02 chkval: 0x571b type: 0x06=trans data

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x0DAF1C00 to 0x0DAF3C00

DAF1C00 0000A206 0280000E 8CD2C049 040205D9  [........I.......]

...

DAF3BF0 00000000 00000000 00000000 C0490602  [..............I.]

Block header dump:  0x0280000e

 Object id on Block? Y

 seg/obj: 0xfb9b  csc: 0x5d9.8cd2c047  itc: 2  flg: E  typ: 2 - INDEX

     brn: 0  bdba: 0x2800009 ver: 0x01 opc: 0

     inc: 0  exflg: 0

 

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000

0x02   0xffff.000.00000000  0x00000000.0000.00  C---    0  scn 0x05d9.8cd2c047

 

Leaf block dump

===============

header address 229579876=0xdaf1c64

kdxcolev 0

KDXCOLEV Flags = - - -

kdxcolok 0

kdxcoopc 0x80: pcode=0: iot flags=--- is converted=Y

kdxconco 1

kdxcosdc 0

kdxconro 449

kdxcofbo 934=0x3a6

kdxcofeo 1750=0x6d6

kdxcoavs 816

kdxlespl 0

kdxlende 0

kdxlenxt 41943055=0x280000f

kdxleprv 41943053=0x280000d

kdxledsz 6

kdxlebksz 8032

row#0[8018] flag: ------, lock: 0, len=14, data:(6):  01 03 21 71 00 01

col 0; len 5; (5):  c4 18 2a 47 1b

row#1[8004] flag: ------, lock: 0, len=14, data:(6):  01 03 21 71 00 04

col 0; len 5; (5):  c4 18 2a 47 1c

row#446[1778] flag: ------, lock: 0, len=14, data:(6):  01 40 00 4f 00 0b

col 0; len 5; (5):  c4 18 2d 05 09

row#447[1764] flag: ------, lock: 0, len=14, data:(6):  01 40 00 50 00 00

col 0; len 5; (5):  c4 18 2d 05 0a

row#448[1750] flag: ------, lock: 0, len=14, data:(6):  01 40 00 50 00 01

col 0; len 5; (5):  c4 18 2d 05 0b

----- end of leaf block dump -----

End dump data blocks tsn: 10 file#: 10 minblk 14 maxblk 14

 

上述黑体部分的部分释义如下:

kdxcolev: index level (0 represents leaf blocks)

索引级别,0代表叶块
kdxcolok: denotes whether structural block transaction is occurring

标注,structural块事务是否发生
kdxcoopc: internal operation code

内部操作代码
kdxconco: index column count

索引列的数量
kdxcosdc: count of index structural changes involving block

块中索引结构改变的数量
kdxconro: number of index entries (does not include kdxbrlmc pointer)

索引实体的数量,不包括kdxbrlmc指针
kdxcofbo: offset to beginning of free space within block

块中空闲空间的开始位置
kdxcofeo: offset to the end of free space (ie. first portion of block containing index data)

块中空闲空间的结束位置
kdxcoavs: available space in block (effectively area between the two fields above)

块中可用空间数量(kdxcofbokdxcofeo

kdxlespl:块拆分时被清除的未提交数据的字节数

kdxlende:被删除的条目数

kdxlenxt:下一个叶块的RBA

kdxleprv:上一个叶块的RBA

kdxlebksz:可使用的块空间(默认小于分支的可用空间)

row#0[8018]:行号[块中起始位置]

flag:标志

lock:锁信息

data:(6):  01 03 21 71 00 01             rowid

转换为二进制数据:

00000001 00000011 00100001 00111000 0000000 00000001

4* file = (hex) 01 0

File#=16/4=4
block = (hex) 3 21 71
row number = (hex) 00 01

SQL> select power(16,0)+power(16,1)*7+power(16,2)++power(16,3)*2+power(16,4)*3 block# from dual;

 

    BLOCK#

----------

    205169

SQL> select name from v$datafile a where a.file#= 4;

 

NAME

--------------------------------------------------------------------------------

/tpdata/database/oradata/test1/users01.dbf

这是文件号

col 0; len 5; (5):  c4 18 2a 47 1b key

 

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16179598/viewspace-667398/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16179598/viewspace-667398/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值