where index_name=upper('orders_local_2_idx');
INDEX_NAME PARTITION_NAME HIGH_VALUE
------------------------------ ------------------------------ ---------------------------------------------------------
ORDERS_LOCAL_2_IDX LOCAL1 TO_DATE(' 1999-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS',
'NLS_CALENDAR=GREGORIA'
ORDERS_LOCAL_2_IDX LOCAL2 TO_DATE(' 1999-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS',
'NLS_CALENDAR=GREGORIA'
ORDERS_LOCAL_2_IDX LOCAL3 TO_DATE(' 1999-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS',
'NLS_CALENDAR=GREGORIA'
ORDERS_LOCAL_2_IDX LOCAL4 TO_DATE(' 2000-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS',
'NLS_CALENDAR=GREGORIA'
从上面的输出可以看出,虽然索引的键值是part_no,但索引分区的键值仍然和表的分区键值相同,即ord_date,也即是所谓的非前缀型索引。
最后,再引用一个例子说明前缀索引和非前缀索引的应用。
假设有一个使用DATE列分区的大表。我们经常使用一个VARCHAR2列(VCOL)进行查询,但这个列并不是表的分区键值。
有两种可能的方法来访问VCOL列的数据,一是建立基于VCOL列的本地非前缀索引,
| |
------- -------
| | (10 more | |
Values: A.. Z.. partitions here) A.. Z..
另一种是建立基于VCOL列的全局索引,
| |
------- -------
| | (10 more | |
Values: A.. D.. partitions here) T.. Z..
可以看出,如果能够保证VCOL列值的唯一性,全局索引将会是最好的选择。如果VCOL列值不唯一,就需要在本地非前缀索引的并行查询和全局索引顺序查询以及高昂的维护代价之间做出选择。
Oracle B-tree索引的浅析
如果聚簇因子过大,那么重建索引可能会有好处,聚簇因子应该接近块的数量,而非行的数量。
Oracle索引经典的神话
?索引会随着时间的增加而变的不平衡;
?删除的索引空间不会被重用;
?随着索引层数的增加,索引将会变得无效并需要重建;
?聚簇因子差,索引需要重建;
?为了提高性能,索引需要经常重建;
索引基础
?一个更新由一个删除和一个插入组成;
?页块由索引条目(row header(2/3B)|length(1B)|indexed data value(nB)|length(1B)|RowID(6B)
)和相应的rowid组成;
Treedump
alter session set events ‘immediate trace name treedump level index_object_id’;
----- begin tree dump
branch: 0x424362 4342626 (0: nrow: 2, level: 1)
leaf: 0x424363 4342627 (-1: nrow: 540 rrow: 540)
leaf: 0x424364 4342628 (0: nrow: 461 rrow: 461)
----- end tree dump
以上dump包含的信息如下:
块类型:
branch(分支块);leaf(页块);
块地址:0x424362 4342626;
nrow:索引条目的数量;
rrow:当前块中的索引条目数量;
level:分支块等级(页块隐示为0);
Block Dump
alter system dump datafile X block X;
alter system dump datafile X block min X1 block max X2
Start dump data blocks tsn: 0 file#: 1 minblk 148538 maxblk 148538
buffer tsn: 0 rdba: 0x0042443a (1/148538)
scn: 0x0000.00162a95 seq: 0x01 flg: 0x04 tail: 0x2a950601
frmt: 0x02 chkval: 0x8b5c type: 0x06=trans data
Block header dump: 0x0042443a
Object id on Block? Y
seg/obj: 0xd1fe csc: 0x00.162a95 itc: 2 flg: O typ: 2 - INDEX
fsl: 0 fnx: 0x42443b ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0005.02a.00000332 0x008005cb.020e.01 CB-- 0 scn 0x0000.00162a92
0x02 0x0008.011.00000346 0x008002e6.0163.03 C--- 0 scn 0x0000.00162a93
该dump包含的信息如下:
rdba:分支块的相对数据库块地址(文件号/块号);
scn:块最后改变的SCN号;
type:块类型;
seq:块改变的数量;
seg/obj: 16进制对象ID;
typ:段类型;
Itl:相关的事务槽(页块默认为2),包括槽ID,事务ID,撤销块地址,标记,锁信息,和事务SCN;
通过rba确定数据文件号和块号:
select DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(rba),
DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(rba)
from dual;
通用的索引块头
header address 153168988=0x9212c5c
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 1
kdxcoopc 0x89: opcode=9: iot flags=--- is converted=Y
kdxconco 2
kdxcosdc 2
kdxconro 254
kdxcofbo 544=0x220
kdxcofeo 4482=0x1182
kdxcoavs 3938
kdxcolev:索引级别(0代表页块);
kdxcolok:标示结构块事块是否发生;
kdxcoopc:内部操作码;
kdxconco:索引列数量,包括ROWID;
kdxcosdc:块中索引结构改变的数量;
kdxconro:索引条目的数量,不包括kdxbrlmc指针;
kdxcofbo:块中空闲空间的开始位置;
kd