rowid,index,INDEX FULL SCAN,INDEX FAST FULL SCAN|

guocun09發表於2011-11-25

物理ROWID,它的組成:

1到6位表示DATA_OBJECT_ID

7到9位表示FILE_ID

10到15位表示FILE_ID下的BLOCK_ID(dba_segments)

16到18位表示的BLOCK_ID中的第機條記錄

編碼規則為64進位制:

ABCDEF  0-5
GHIJK   6-10
LMNOP   11-15
QRSTU   16-20
VWXYZ   21-25
abcdef  26-31
ghijk   32-36
lmnop   37-41
qrstu   42-46
vwxyz   47-51
01234   52-56
56789   57-61
+/      62-63

 TABLE ACCESS FULL(讀取物理資料塊時是按順序的)

select a.rowid||'' row_id,a.* from sfism4.r_wip_tracking_t a;
可以看到rowid是按64進位制從小到大的,第一個AAANnYAAGAAAAK8AAA,AAANnYAAGAAAAK8AAB,可以理解rowid在資料塊中是連續的

select 13*64*64+39*64+24 "AAANnY",6 "AAG",10*64+60 "AAAAK8",0 "AAA" from dual;

AAANnY AAG AAAAK8 AAA
55768 6 700 0

select * from dba_objects where data_object_id=55768;

select * from dba_segments where segment_name='R_WIP_TRACKING_T';

OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME HEADER_FILE HEADER_BLOCK BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE FREELISTS FREELIST_GROUPS RELATIVE_FNO BUFFER_POOL
SFISM4 R_WIP_TRACKING_T  TABLE USER02 6 699 720896 88 11 65536  1 2147483645    6 DEFAULT
看到全表掃描的第一行是在第700號block,和這裡的HEADER_BLOCK699只差一個塊。

select * from dba_extents where file_id=6 and segment_name='R_WIP_TRACKING_T'; 最後一個extent BLOCK_ID為69793

但到了AAANnYAAGAAAAK9AAc突然跳到AAANnYAAGAAAAK+AAA,看到最後一行資料ROWID:AAANnYAAGAAARCoAAN為69800號block,而dba_segments中blocks為88。可以理解為segment中的extent不一定是連續的,但extent中的block一定是連續的。

 

INDEX FULL SCANINDEX UNIQUE SCANINDEX RANGE SCAN(都是按索引鍵值順序讀取的,注:鍵值相鄰的行,所在的表的block不一定相鄰)

select  /*+ index(a pk_wip_tracking_t)*/a.rowid||'' row_id,a.serial_number from sfism4.r_wip_tracking_t a order by serial_number asc;

|   0 | SELECT STATEMENT
|   1 |  INDEX FULL SCAN | PK_WIP_TRACKING_T

發現執行計劃中就不需要SORT ORDER BY排序操作,證明在做INDEX FULL SCAN時按索引順序進行的掃描

 

INDEX FAST FULL SCAN(索引塊多塊讀取,不按索引鍵的順序)

 

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25583515/viewspace-712104/,如需轉載,請註明出處,否則將追究法律責任。

相關文章