--使用rowid獲取table的object_id
select rowid,
dbms_rowid.rowid_object(rowid) object_id,
dbms_rowid.rowid_relative_fno(rowid) file_num,
dbms_rowid.rowid_block_number(rowid) block_number,
dbms_rowid.rowid_row_number(rowid) row_number,
dbms_rowid.rowid_to_absolute_fno(rowid,'sys','test') file#
from table
where table.conditon = 'your condition'
--根據objectid得知該資料位於哪個分割槽
select a.object_name,
a.object_type,
a.subobject_name,
a.object_id,
a.data_object_id
from dba_objects a
where object_name = upper('table_name')
and object_id = 3019792
以上為原創.
--rowid的含義:
參考自:
為了方便,我直接放這裡了:
rowid是資料的詳細位址,通過rowid,oracle可以快速的定位某行具體的資料的位置。
rowid可以分為物理rowid和邏輯rowid兩種。普通的堆表中的rowid是物理rowid,索引組織表(iot)的rowid是邏輯rowid。oracle提供了一種urowid的資料型別,同時支援物理和邏輯rowid。本文主要關注物理rowid
物理rowid又分為擴充套件rowid(extended rowid)和限制rowid(restricted rowid)兩種格式。限制rowid主要是oracle7以前的rowid格式,現在已經不再使用,保留該型別只是為了相容性。所以本文的提到物理rowid一般是指擴充套件rowid格式。
本文主要內容:
1.rowid的顯示形式
2.如何從rowid計算得到obj#,rfile#,block#,row#
3.如何從obj#,rfile#,block#,row#計算得到rowid
4.rowid的內部儲存格式
5.index中儲存的rowid
1.rowid的顯示形式
我們從rowid偽列裡select出來的rowid是基於base64編碼,一共有18位,分為4部分:
oooooofffbbbbbbrrr
其中:oooooo: 六位表示data object id,根據object id可以確定segment。關於data object id和object id的區別,請參考
fff: 三位表示相對檔案號。根據該相對檔案號可以得到絕對檔案號,從而確定datafile。關於相對檔案號和絕對檔案號,請參考
bbbbbb:六位表示data block number。這裡的data block number是相對於datafile的編號,而不是相對於tablespace的編號。
rrr:三位表示row number。
oracle提供了dbm_rowid來進行rowid的一些轉換計算。
sql> create table test(id int,name varchar2(30));
table created.
sql> insert into test values(1,'a');
1 row created.
sql> commit;
commit complete.
sql> select rowid from test;
rowid
------------------
aaagbeaahaaaab8aaa
sql> select dbms_rowid.rowid_object(rowid) obj#,
2 dbms_rowid.rowid_relative_fno(rowid) rfile#,
3 dbms_rowid.rowid_block_number(rowid) block#,
4 dbms_rowid.rowid_row_number(rowid) row#,
5 dbms_rowid.rowid_to_absolute_fno(rowid,'sys','test') file#
6 from test;
--oracle object_id和data_object_id的區別
oracle的資料字典表dba_objects包含了兩個字段,object_id, data_object_id,官方文件上的解釋是:
object_id: dictionary object numberofthe object.
data_object_id: dictionary object
number
of the segment that contains the object.
object_id : 資料的編號,類似於row_number
data_object_id:儲存資料的實體地址,類似於指標
使用ROWID查詢和刪除重複行
sql create table lunar 2c1 char 4 3c2 varchar2 20 4 5 表已建立。sql insert into lunar values 1111 1111 已建立1 行。sql insert into lunar values 1112 1111 已建立1 行...
使用ROWID查詢和刪除重複行
sql create table lunar 2c1 char 4 3c2 varchar2 20 4 5 表已建立。sql insert into lunar values 1111 1111 已建立1 行。sql insert into lunar values 1112 1111 已建立1 行...
wcdb中使用rowid做查詢條件
近期有個需求是需要通過rowid的方式降序查詢所有的結果,具體的sql語句是這樣的 select from tbl mail recent list order by rowid descrowid作為sqlite裡面相對特殊的屬性,是可以直接使用的,但是對於wcdb的winq語法那就麻煩了,於是在...