使用 rowID查詢資料位於分割槽表哪個分割槽中

2021-08-13 18:45:27 字數 2760 閱讀 2566

--使用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 number

ofthe 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語法那就麻煩了,於是在...