index desc之後資料在leaf node中是如何儲存的!

warehouse發表於2009-02-04

困擾了很久的問題得以解決,比較興奮,儘管對我們使用而言可能用處不大!

[@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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章