索引ROWID轉換函式
SQL> create table t as select * from dba_objects;
表已建立。
SQL> create index t_idx on t(object_name);
索引已建立。
SQL> alter system checkpoint;
系統已更改。
SQL> select header_file,header_block from dba_segments where segment_name='T_IDX';
HEADER_FILE HEADER_BLOCK
----------- ------------
4 1154
SQL> alter system dump datafile 4 block 1156;
系統已更改。
row#0[7996] flag: ------, lock: 0, len=40
col 0; len 30; (30):
2f 31 30 30 30 33 32 33 64 5f 44 65 6c 65 67 61 74 65 49 6e 76 6f 63 61 74
69 6f 6e 48 61
col 1; len 6; (6): 01 00 02 66 00 1b
這個是索引中儲存的ROWID資訊,但是,具體指向的是哪裡呢?
實際上rowid包含以下內容:32位object_id,10位file#,22位block#,16位row#
對於普通索引而言,沒有32位的object_id
我們只需要將"01 00 02 66 00 1b”轉換為2進位制,擷取相應的長度即可找出具體的指向。
SQL> select idx_rowid('01 00 02 66 00 1b') from dual;
IDX_ROWID('01000266001B')
--------------------------------------------------------------------------------
File# = 4, Block# = 614, Row# = 27
SQL> alter system dump datafile 4 block 614;
系統已更改。
tab 0, row 27, @0x1421
tl: 107 fb: --H-FL-- lb: 0x0 cc: 14
col 0: [ 3] 53 59 53
col 1: [30]
2f 31 30 30 30 33 32 33 64 5f 44 65 6c 65 67 61 74 65 49 6e 76 6f 63 61 74
69 6f 6e 48 61
col 2: *NULL*
col 3: [ 4] c3 04 29 2b
col 4: *NULL*
col 5: [10] 4a 41 56 41 20 43 4c 41 53 53
col 6: [ 7] 78 6e 05 19 0e 0c 1a
col 7: [ 7] 78 6e 05 19 0e 0c 1a
col 8: [19] 32 30 31 30 2d 30 35 2d 32 35 3a 31 33 3a 31 31 3a 32 35
col 9: [ 5] 56 41 4c 49 44
col 10: [ 1] 4e
col 11: [ 1] 4e
col 12: [ 1] 4e
col 13: [ 2] c1 02
tab 0, row 28, @0x13b6
SQL> select idx_rowid('01 00 02 66 00 1b') from dual;
IDX_ROWID('01000266001B')
--------------------------------------------------------------------------------
File# = 4, Block# = 614, Row# = 27
SQL> alter system dump datafile 4 block 614;
系統已更改。
tab 0, row 27, @0x1421
tl: 107 fb: --H-FL-- lb: 0x0 cc: 14
col 0: [ 3] 53 59 53
col 1: [30]
2f 31 30 30 30 33 32 33 64 5f 44 65 6c 65 67 61 74 65 49 6e 76 6f 63 61 74
69 6f 6e 48 61
col 2: *NULL*
col 3: [ 4] c3 04 29 2b
col 4: *NULL*
col 5: [10] 4a 41 56 41 20 43 4c 41 53 53
col 6: [ 7] 78 6e 05 19 0e 0c 1a
col 7: [ 7] 78 6e 05 19 0e 0c 1a
col 8: [19] 32 30 31 30 2d 30 35 2d 32 35 3a 31 33 3a 31 31 3a 32 35
col 9: [ 5] 56 41 4c 49 44
col 10: [ 1] 4e
col 11: [ 1] 4e
col 12: [ 1] 4e
col 13: [ 2] c1 02
tab 0, row 28, @0x13b6
[ 本帖最後由 sundog315 於 2010-6-25 13:43 編輯 ]
表已建立。
SQL> create index t_idx on t(object_name);
索引已建立。
SQL> alter system checkpoint;
系統已更改。
SQL> select header_file,header_block from dba_segments where segment_name='T_IDX';
HEADER_FILE HEADER_BLOCK
----------- ------------
4 1154
SQL> alter system dump datafile 4 block 1156;
系統已更改。
row#0[7996] flag: ------, lock: 0, len=40
col 0; len 30; (30):
2f 31 30 30 30 33 32 33 64 5f 44 65 6c 65 67 61 74 65 49 6e 76 6f 63 61 74
69 6f 6e 48 61
col 1; len 6; (6): 01 00 02 66 00 1b
這個是索引中儲存的ROWID資訊,但是,具體指向的是哪裡呢?
實際上rowid包含以下內容:32位object_id,10位file#,22位block#,16位row#
對於普通索引而言,沒有32位的object_id
我們只需要將"01 00 02 66 00 1b”轉換為2進位制,擷取相應的長度即可找出具體的指向。
SQL> select idx_rowid('01 00 02 66 00 1b') from dual;
IDX_ROWID('01000266001B')
--------------------------------------------------------------------------------
File# = 4, Block# = 614, Row# = 27
SQL> alter system dump datafile 4 block 614;
系統已更改。
tab 0, row 27, @0x1421
tl: 107 fb: --H-FL-- lb: 0x0 cc: 14
col 0: [ 3] 53 59 53
col 1: [30]
2f 31 30 30 30 33 32 33 64 5f 44 65 6c 65 67 61 74 65 49 6e 76 6f 63 61 74
69 6f 6e 48 61
col 2: *NULL*
col 3: [ 4] c3 04 29 2b
col 4: *NULL*
col 5: [10] 4a 41 56 41 20 43 4c 41 53 53
col 6: [ 7] 78 6e 05 19 0e 0c 1a
col 7: [ 7] 78 6e 05 19 0e 0c 1a
col 8: [19] 32 30 31 30 2d 30 35 2d 32 35 3a 31 33 3a 31 31 3a 32 35
col 9: [ 5] 56 41 4c 49 44
col 10: [ 1] 4e
col 11: [ 1] 4e
col 12: [ 1] 4e
col 13: [ 2] c1 02
tab 0, row 28, @0x13b6
SQL> select idx_rowid('01 00 02 66 00 1b') from dual;
IDX_ROWID('01000266001B')
--------------------------------------------------------------------------------
File# = 4, Block# = 614, Row# = 27
SQL> alter system dump datafile 4 block 614;
系統已更改。
tab 0, row 27, @0x1421
tl: 107 fb: --H-FL-- lb: 0x0 cc: 14
col 0: [ 3] 53 59 53
col 1: [30]
2f 31 30 30 30 33 32 33 64 5f 44 65 6c 65 67 61 74 65 49 6e 76 6f 63 61 74
69 6f 6e 48 61
col 2: *NULL*
col 3: [ 4] c3 04 29 2b
col 4: *NULL*
col 5: [10] 4a 41 56 41 20 43 4c 41 53 53
col 6: [ 7] 78 6e 05 19 0e 0c 1a
col 7: [ 7] 78 6e 05 19 0e 0c 1a
col 8: [19] 32 30 31 30 2d 30 35 2d 32 35 3a 31 33 3a 31 31 3a 32 35
col 9: [ 5] 56 41 4c 49 44
col 10: [ 1] 4e
col 11: [ 1] 4e
col 12: [ 1] 4e
col 13: [ 2] c1 02
tab 0, row 28, @0x13b6
[ 本帖最後由 sundog315 於 2010-6-25 13:43 編輯 ]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19423/viewspace-666262/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 轉換函式函式
- numtoyminterval函式——數字轉換函式函式
- MySQL索引失效之隱式轉換MySql索引
- 類的轉換函式函式
- php轉換ip函式PHP函式
- js日期轉換函式JS函式
- 函式式 Java 到函式式 Kotlin 的轉換函式JavaKotlin
- 【隱式轉換】注意隱式轉換將導致索引無法使用索引
- oracle 10g函式大全--轉換函式Oracle 10g函式
- 函式組:TRUX 包含很多的轉換函式函式UX
- 索引失效系列——隱式型別轉換索引型別
- Oracle OCP(05):轉換函式Oracle函式
- 8.轉換文字函式函式
- 混沌 IN C++::轉換函式C++函式
- ORACLE單行函式與多行函式之五:轉換函式示例Oracle函式
- 函式索引陷阱函式索引
- oracle函式索引Oracle函式索引
- 索引關鍵字的隱式轉換分析索引
- 轉換時間戳的函式時間戳函式
- oracle 全形半形轉換函式Oracle函式
- c++ operator typename 轉換函式C++函式
- 日期轉換為raw的函式函式
- string大小寫轉換函式函式
- SQL 數字轉換英文函式SQL函式
- 函式索引使用細節——自定義函式的索引化函式索引
- mysql和oracle字串編碼轉換函式,字串轉位元組函式例子MySqlOracle字串編碼函式
- Oracle隱式型別轉換導致索引失效Oracle型別索引
- Oracle之函式索引Oracle函式索引
- 說說函式索引函式索引
- 索引中使用函式索引函式
- oracle內部轉換函式雜談Oracle函式
- GBK中文繁簡轉換函式函式
- MySQL字串函式 字串大小寫轉換MySql字串函式
- Base64與BLOB 轉換函式函式
- 浮點數轉換成字串函式字串函式
- oracle時間間隔轉換函式Oracle函式
- oracle中進位制轉換函式Oracle函式
- [轉]decode函式和行列互換函式