我們可能對oracle的rowid的使用並不陌生
不過
如果仔細分析一下
發現其還是有些知識點
rowid是一個偽列
是用來確保表中行的唯一性
它並不能指示出行的物理位置
但可以用來定位行
rowid是存儲在索引中的一組既定的值(當行確定後)
我們可以像表中普通的列一樣將它選出來
利用rowid是訪問表中一行的最快方式
rowid需要
個字節來存儲
顯示為
位的字符串
rowid的組成結構為
data object number(
位字符串)+relative file number(
位字符串)+block number(
位字符串)+row number(
位字符串)
如
AAAADeAABAAAAZSAAA
我們可以借助oracle提供的包dbms_rowid
來對rowid進行解析從而獲取關於行的相關信息
bossdb
SQL>select
rowid
dbms_rowid
rowid_object(rowid) obj_id
dbms_rowid
rowid_relative_fno(rowid) df#
dbms_rowid
rowid_block_number(rowid) blknum
dbms_rowid
rowid_row_number(rowid) rowno
from p_test where rownum<
;
ROWID OBJ_ID DF# BLKNUM ROWNO
AAAQ+tAANAAAC
SAAA
AAAQ+tAANAAAC
SAAB
AAAQ+tAANAAAC
SAAC
AAAQ+tAANAAAC
SAAD
我們可以看到
通過rowid_row_number得到的行號是從
開始的
這是和rownum偽列的一個不同之處
我猜測rowid_row_number在求行號的時候是計算首行的偏移量
一般來說
當表中的行確定後
rowid就不會發生變化
但當如下情況發生時
rowid將發生改變
對一個表做表空間的移動後
對一個表進行了EXP/IMP後
From:http://tw.wingwit.com/Article/program/Oracle/201311/17378.html