2017年(38)
分类: Oracle
2017-12-07 13:48:12
物理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 SCAN和INDEX UNIQUE SCAN或INDEX 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(索引塊多塊讀取,不按索引鍵的順序)