index desc之后数据在leaf node中是如何存储的!

困扰了很久的问题得以解决,比较兴奋,尽管对我们使用而言可能用处不大!

[@more@]

SQL> create table t(id int ,name varchar2(10)) tablespace users;

表已创建。

SQL> insert into t values(1,'abc');

已创建 1 行。

SQL> insert into t values(2,'bcd');

已创建 1 行。

SQL> insert into t values(3,'cde');

已创建 1 行。

SQL> insert into t values(123,'test');

已创建 1 行。

SQL> insert into t values(321,'testabc');

已创建 1 行。

SQL> commit;

提交完成。

SQL> create index idx_t_id on t(id desc);

索引已创建。

SQL> create index idx_t_name on t(name desc);

索引已创建。

SQL> select object_id from dba_objects where object_name IN ('IDX_T_ID','IDX_T_N
AME');

OBJECT_ID
----------
12878
12879

SQL> alter system set events 'immediate trace name treedump level 12878';

系统已更改。
--========================
----- begin tree dump
leaf: 0x408072 4227186 (0: nrow: 5 rrow: 5)
----- end tree dump
--========================
SQL> select dbms_utility.data_block_address_file(4227186) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(4227186)
---------------------------------------------
1

SQL> select dbms_utility.data_block_address_block(4227186) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(4227186)
----------------------------------------------
32882

SQL> alter system dump datafile 1 block 32882;

系统已更改。
--=============================
row#0[8022] flag: ------, lock: 0, len=14
col 0; len 4; (4): 3d fb e9 ff
col 1; len 6; (6): 01 00 00 45 00 04
row#1[8008] flag: ------, lock: 0, len=14
col 0; len 4; (4): 3d fd e7 ff
col 1; len 6; (6): 01 00 00 45 00 03
row#2[7995] flag: ------, lock: 0, len=13
col 0; len 3; (3): 3e fb ff
col 1; len 6; (6): 01 00 00 45 00 02
row#3[7982] flag: ------, lock: 0, len=13
col 0; len 3; (3): 3e fc ff
col 1; len 6; (6): 01 00 00 45 00 01
row#4[7969] flag: ------, lock: 0, len=13
col 0; len 3; (3): 3e fd ff --这个应该是1,如何和1关联起来?
col 1; len 6; (6): 01 00 00 45 00 00
--=============================
SQL> select id,name,rowid from t;

ID NAME ROWID
---------- ---------- ------------------
1 abc AAADJNAAEAAAABFAAA
2 bcd AAADJNAAEAAAABFAAB
3 cde AAADJNAAEAAAABFAAC
123 test AAADJNAAEAAAABFAAD
321 testabc AAADJNAAEAAAABFAAE

SQL> select dbms_rowid.rowid_relative_fno(rowid) fno,dbms_rowid.rowid_block_numb
er(rowid) bno,dbms_rowid.rowid_row_number(rowid) rno ,id,name from t;

FNO BNO RNO ID NAME
---------- ---------- ---------- ---------- ----------
4 69 0 1 abc
4 69 1 2 bcd
4 69 2 3 cde
4 69 3 123 test
4 69 4 321 testabc

SQL>
SQL> alter system set events 'immediate trace name treedump level 12879';

系统已更改。

SQL>
--============================
----- begin tree dump
leaf: 0x40819a 4227482 (0: nrow: 5 rrow: 5)
----- end tree dump
--============================
SQL> select dbms_utility.data_block_address_file(4227482) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(4227482)
---------------------------------------------
1

SQL> select dbms_utility.data_block_address_block(4227482) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(4227482)
----------------------------------------------
33178

SQL> alter system dump datafile 1 block 33178;

系统已更改。

SQL>
--=========================
col 0; len 8; (8): 8b 9a 8c 8b 9e 9d 9c ff
col 1; len 6; (6): 01 00 00 45 00 04
row#1[8003] flag: ------, lock: 0, len=15
col 0; len 5; (5): 8b 9a 8c 8b ff
col 1; len 6; (6): 01 00 00 45 00 03
row#2[7989] flag: ------, lock: 0, len=14
col 0; len 4; (4): 9c 9b 9a ff
col 1; len 6; (6): 01 00 00 45 00 02
row#3[7975] flag: ------, lock: 0, len=14
col 0; len 4; (4): 9d 9c 9b ff
col 1; len 6; (6): 01 00 00 45 00 01
row#4[7961] flag: ------, lock: 0, len=14
col 0; len 4; (4): 9e 9d 9c ff --这个应该是abc,如何关联起来?
col 1; len 6; (6): 01 00 00 45 00 00
--=========================
实际是这样存储的:
--=============================
值'abc'在index desc的leaf node中dump出来之后发现是9e 9d 9c ff
实际'abc'的存储应该是:61 62 63
SQL> select dump('abc',16) from dual;

DUMP('ABC',16)
----------------------
Typ=96 Len=3: 61,62,63

SQL>
--==============================
那么9e 9d 9c ff转为二进制数如下:
10011110 10011101 10011100 11111111
上面的每一位bit位取反,结果如下:
01100001 01100010 01100011 00000000
再转为10进制数如下:
64+32+1=97
64+32+2=98
64+32+3=99
不正是'abc'对应的ascii码吗?
转成字符就是abc了
看来index desc oracle仅仅是做了一个取反的操作
--================================
数值同样如此:
数值1 index desc之后leaf node上存储如下:
3e fd ff
转为为二进制数:
00111110 11111101 11111111
每一位取反:
11000001 00000010 00000000
转为16进制数:
c1 02
而数值1的实际存储不正是c1,02
SQL> select dump(1,16) from dual;

DUMP(1,16)
-----------------
Typ=2 Len=2: c1,2

SQL>

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

转载于:http://blog.itpub.net/19602/viewspace-1016681/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值