--分頁第一步 擷取資料物理地址select t.rowid rid, t.lastdate from t_test t order by t.lastdate desc;--分頁第二步 取得最大頁數select rownum rn, rid from (select t.rowid rid, t.lastdate from t_test t order by t.lastdate desc) where rownum <= 10; --分頁第三步 取得最小頁數 select rn,rid from (select rownum rn, rid from (select t.rowid rid, t.lastdate from t_test t order by t.lastdate desc) where rownum <= 10) where rn > 5; --分頁第四步 再根據物理地址,查詢出具體資料 select t1.*,t1.rowid from t_test t1 where t1.rowid in (select rid from (select rownum rn, rid from (select rowid rid, t.lastdate from t_test t order by t.lastdate desc) where rownum <= 10000) where rn > 5000);
在8i以前rowid由file#+block#+row# 組成,佔用6個bytes的空間,10 bit的file# ,22 bit 的block#,16 bit 的row#。
其中oracle的dba(data block address)是32 bits的,包括10 bit 的 file# 和 22 bit 的block#。
由於不存在0編號檔案,oracle中的檔案最大數量2^10-1=1023
而datafile能達到的最大size就是2^22*db_block_size
如果db_block_size為4k的datafile max size就是16G
如果db_block_size為8k的datafile max size就是32G
從oracle 8開始rowid變成了extend rowid,由data_object_id#+rfile#+block#+row#組成,佔用10個bytes的空間,
32bit的 data_object_id#,10 bit 的 rfile#,22bit 的 block#,16 bit 的 row#.由於rowid的組成從file#變成了rfile#,
所以資料檔案數的限制也從整個庫不能超過1023個變成了每個data_object_id不能超過1023個資料檔案。當然,你或許要問,
為什麼oracle不調整rowid中表示 file# 的 bit數量,這個應該是由於相容性的引起的,在 oracle7 的索引中儲存的rowid
就是 file# + block# + row# ,因為這樣處理後關於索引的儲存,oracle8和oracle7沒有發生變化。
雖然oracle使用了extend rowid,但是在普通索引裡面依然儲存了bytes的rowid,只有在global index中儲存的是10bytes
的extend rowid,而extend rowid也是global index出現的一個必要條件。
1. rowid基本概念:
1) rowid是一個偽列,是用來確保表中行的唯一性,它並不能指示出行的物理位置,但可以用來定位行
2) rowid是儲存在索引中的一組既定的值(當行確定後)。我們可以像表中普通的列一樣將它選出來
3) 利用rowid是訪問表中一行的最快方式
4) rowid需要10個位元組來儲存,顯示為18位的字串。
2. 什麼情況下rowid會發生變化
一般來說,當表中的行確定後,rowid就不會發生變化。 但當如下情況發生時,rowid將發生改變:
1) 對一個表做資料表空間的移動後
2) 對一個表進行了EXP/IMP後