困扰了很久的问题得以解决,比较兴奋,尽管对我们使用而言可能用处不大!
[@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/