Oracle優化器基礎知識之訪問資料的方法(一)
@[toc]
一、訪問資料的方法
Oracle訪問表中資料的方法有兩種,一種是直接表中訪問資料,另外一種是先訪問索引,如果索引資料不符合目標SQL,就回表,符合就不回表,直接訪問索引就可以。
本部落格先介紹直接訪問資料的方法,下一篇部落格介紹訪問索引的方法
1、直接訪問資料
Oracle直接訪問表中資料的方法又分為兩種:一種是全表掃描;另一種是ROWID掃描
1.1 全表掃描
全表掃描是Oracle直接訪問資料的一種方法,全表掃描時從第一個區(EXTENT)的第一個塊(BLOCK)開始掃描,一直掃描的到表的高水位線(High Water Mark),這個範圍內的資料塊都會掃描到
全表掃描是採用多資料塊一起掃的,並不是一個個資料庫掃的,然後我們經常說全表掃描慢是針對資料量很多的情況,資料量少的話,全表掃描並不慢的,不過隨著資料量越多,高水位線也就越高,也就是說需要掃描的資料庫越多,自然掃描所需要的IO越多,時間也越多
注意:資料量越多,全表掃描所需要的時間就越多,然後直接刪了表資料呢?查詢速度會變快?其實並不會的,因為即使我們刪了資料,高位水線並不會改變,也就是同樣需要掃描那麼多資料塊
1.2 ROWID掃描
ROWID也就是表資料行所在的物理儲存地址,所謂的ROWID掃描是通過ROWID所在的資料行記錄去定位。ROWID是一個偽列,資料庫裡並沒有這個列,它是資料庫查詢過程中獲取的一個實體地址,用於表示資料對應的行數。
用sql查詢:
select t.* , rowid from 表格
隨意獲取一個ROWID序列:AAAWSJAAFAAAWwUAAA,前6位表示物件編號(Data Object number),其後3位檔案編號(Relative file number),接著其後6位表示塊編號(Block number), 再其後3位表示行編號(Row number)

在這裡插入圖片描述
ROWID編碼方法是:A ~ Z表示0到25;a ~ z表示26到51;0~9表示52到61;+表示62;/表示63;剛好64個字元。
這裡隨意找張表查一下檔案編號、區編號、行編號,查詢後會返回rowid的一系列實體地址和檔案編號(rowid_relative_fno(rowid))、塊編號(rowid_block_number(rowid))、行編號(rowid_row_number(rowid))
select t.seq, rowid, dbms_rowid.rowid_relative_fno(rowid), dbms_rowid.rowid_block_number(rowid), dbms_rowid.rowid_row_number(rowid) from t_info t
SQL查詢一下表格名稱為TABLE的物件編碼
select owner,object_id,data_object_id,status from dba_objects where object_name='TABLE';
相對檔案id和絕對檔案編碼
相對檔案id是指相對於表空間,在表空間唯一;絕對檔案編碼是指相當於全域性資料庫而言的,全域性唯一;下面SQL查詢一下相對檔案id和絕對檔案編碼
select file_name,file_id,relative_fno from dba_data_files;