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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 理解index leaf node 90-10 splitIndex
- Android中的資料儲存之檔案儲存Android
- 唯一index和非唯一index中leaf node裡rowid的一點區別。Index
- 小數在記憶體中是如何儲存的?記憶體
- Android資料儲存之SharedPreferences及如何安全儲存Android
- Use index_descIndex
- Android中的資料儲存之SharedPreferencesAndroid
- iOS中的資料儲存iOS
- oracle hint之full,index,index_asc,index_desc,index_combile示例OracleIndex
- 現在後端都在用什麼資料庫儲存資料?後端資料庫
- Hive之 資料儲存Hive
- 怎樣在資料庫中儲存貨幣資料庫
- Flutter持久化儲存之資料庫儲存Flutter持久化資料庫
- 如何在資料庫中儲存小數:FLOAT、DECIMAL還是BIGINT?資料庫Decimal
- 資料字典表中儲存幾天資料,歷史資料刪除後會自動優化(rebuild index,降低HWM)麼?優化RebuildIndex
- Android中的資料儲存Android
- 儲存資料之SharedPreference
- IOS資料儲存之NSUserDefaultsiOS
- 如何在安卓應用程式中儲存資料安卓
- k8s之資料儲存-配置儲存K8S
- IOS資料儲存之檔案沙盒儲存iOS
- 在關聯式資料庫中儲存RDF (轉)資料庫
- MongoDB後設資料的儲存介紹MongoDB
- 在Vue中體驗LeanCloud無後臺輕量級資料儲存服務VueCloud
- index branch and leaf block structure(轉)IndexBloCStruct
- iOS開發資料儲存篇—iOS中的幾種資料儲存方式iOS
- double型別資料在記憶體中中儲存格式型別記憶體
- IOS資料儲存之Sqlite資料庫iOSSQLite資料庫
- IOS資料儲存之FMDB資料庫iOS資料庫
- 記憶體中的資料儲存記憶體
- k8s之資料儲存-高階儲存K8S
- 如何在資料庫中儲存一棵樹資料庫
- innodb是如何存資料的?yyds
- 你真的瞭解資料在堆疊中的儲存方式嗎?
- 在Hadoop環境中,大資料儲存的技巧有哪些?Hadoop大資料
- 資料成本:雲端儲存成本高嗎如何節省資料儲存成本
- 什麼是YottaChain儲存,為什麼說是未來資料儲存的趨勢?AI
- [201112114]index leaf node 50-50 splitIndex