Oracle學習指南之rowid詳解

本篇文章給大家帶來了關于oracle的相關知識,其中主要介紹了關于rowid的相關問題,oracle數據庫的表中的每一行數據都有一個唯一的標識符,或者稱為rowid,在oracle內部通常就是使用它來訪問數據的,希望對大家有幫助。

Oracle學習指南之rowid詳解

推薦教程:《oracle

一、rowid中保存信息概述

oracle數據庫的表中的每一行數據都有一個唯一的標識符,或者稱為rowid,在oracle內部通常就是使用它來訪問數據的。rowid需要 10個字節的存儲空間,并用18個字符來顯示。該值表明了該行在oracle數據庫中的物理具體位置。可以在一個查詢中使用rowid來表明查詢結果中包含該值。

????? 保存rowid需要10個字節或者是80個位二進制位。一個擴展rowid采用10個byte來存儲,共80bit,其中obj#32bit,rfile#10bit,block#22bit,row#16bit。所以相對文件號不能超過1023,也就是一個表空間的數據文件不能超過1023個(不存在文件號為0的文件),一個datafile只能有2^22=4M個block,,一個block中不能超過2^16=64K行數據。而一個數據庫內不能有超過2^32=4G個Object
這80個二進制位分別是:
????? 1. 數據對象編號,表明此行所屬的數據庫對象的編號,每個數據對象在數據庫建立的時候都被唯一分配一個編號,并且此編號唯一。數據對象編號占用大約32位。
????? 2. 對應文件編號,表明該行所在文件的編號,表空間的每一個文件標號都是唯一的。文件編號所占用的位置是10位。
????? 3. 塊編號,表明改行所在文件的塊的位置塊編號需要22位。
????? 4. 行編號,表明該行在行目錄中的具體位置行編號需要16位。
這樣加起來就是80位。

備注:在oracle 8版本以前,rowid由file# block# row#組成,占用6個bytes的空間,10 bit 的 file# ,22bit 的 block# ,16 bit 的 row#。oracle8及之后版本改為10個bytes的空間。

Oracle學習指南之rowid詳解

Oracle的物理擴展ROWID有18位,每位采用64位編碼,分別用A~Z、a~z、0~9、+、/共64個字符表示。A表示0,B表示1,……Z表示25,a表示26,……z表示51,0表示52,……,9表示61,+表示62,/表示63。

SELECT T.ROWID, T.* FROM DEPT T

Oracle學習指南之rowid詳解

為了驗證rowid的存儲空間為10字節,其中32bit的object#,10bit的rfile#,22bit的block#,16bit的row#。我們需要使用dump函數。

select rowid,dump(rowid,16) from DEPT

二、驗證查看rowid內容

1、使用dbms_rowid包中函數查看

SELECT ROWID,        DBMS_ROWID.ROWID_OBJECT(ROWID) AS OBJECT,        DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) AS FILENUM,        DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) AS BLOCK,        DBMS_ROWID.ROWID_ROW_NUMBER(ROWID) AS ROWN   FROM DEPT;

結果如下:

Oracle學習指南之rowid詳解

2、從表中查詢數據信息

1)查詢對象編號:DATA_OBJECT_ID

SELECT OBJECT_NAME, OBJECT_TYPE, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID   FROM DBA_OBJECTS T  WHERE T.OBJECT_NAME ='DEPT'  AND T.OWNER = 'CHF';

結果如下:

Oracle學習指南之rowid詳解

說明:DATA_OBJECT_ID與OBJECT_ID的區別

object_id和data_object_id 都是對象的唯一標識。

object_id是對象的邏輯標識

data_object_id是對象的物理標識

只有表,索引,undo這些有實際物理存儲位置的對象才有data_object_id。而對于沒有物理存儲的對象,data_object_id就是空。例如:(procedure,function,package,data type,db link,mv定義,view定義,臨時表,分區表定義等等)

大多數情況下兩者是相等的。但對object 進行truncate,move, rebuild 等操作后,data_object_id就會發生改變,而object_id不會改變。

?對標DEPT執行truncate操作,代碼:TRUNCATE table DEPT;

再次查詢結果:

Oracle學習指南之rowid詳解

將truncate前數據重新插入表中,查看rowid代表對象號的部分已發生變化由AAAUOO變為AAAUOP,增加了1。

Oracle學習指南之rowid詳解

2)查詢文件編號:

SELECT T.SEGMENT_NAME, T.HEADER_BLOCK, T.BLOCKS, T.EXTENTS, T.RELATIVE_FNO   FROM DBA_SEGMENTS T  WHERE T.SEGMENT_NAME = 'DEPT'    AND T.OWNER = 'CHF';

HEADER_BLOCK:本表的第一個數據塊號

BLOCKS:本表的數據塊數

RELATIVE_FNO:相對文件編號

結果如下:

Oracle學習指南之rowid詳解

說明:

從Oracle8開始,Oracle開始使用“相對文件號”,使原來一個數據庫最多只能有1023個文件,擴展為一個表空間最多可以有1023個文件,每個庫最多可以有65534個文件

驗證文件號

SELECT T.TABLE_NAME,        T.TABLESPACE_NAME,        G.FILE_NAME,        G.FILE_ID,        G.RELATIVE_FNO   FROM DBA_TABLES T  INNER JOIN DBA_DATA_FILES G     ON G.TABLESPACE_NAME = T.TABLESPACE_NAME  WHERE T.TABLE_NAME = 'DEPT'  AND T.OWNER = 'CHF';

執行結果:

Oracle學習指南之rowid詳解

因為創建用戶時沒用指定默認表空間,建表時也沒用指定表空間,所以此處使用的USERS表空間(大家不必在意這些細節…),可以看到文件號和相對文件號都是 4 ,這是因為我的數據庫中每個表空間只有一個數據文件,如果一個表空間有多個數據文件,這兩個值有可能不一樣。

知識擴展:

我們可以使用跟蹤文件查看數據文件信息,命令:alter Session set events ‘immediate trace name FILE_HDRS level 10’;

執行完此代碼后,將在數據庫服務器生成一個跟蹤文件,查看文件路徑代碼:

select   u_dump.value || '/' ||   db_name.value || '_ora_' ||   v$process.spid ||   nvl2(v$process.traceid, '_' || v$process.traceid, null )   || '.trc' "Trace File" from v$parameter u_dump cross join v$parameter db_name cross join v$process join v$session on v$process.addr = v$session.paddr where   u_dump.name = 'user_dump_dest' and   db_name.name = 'db_name' and   v$session.audsid=sys_context('userenv','sessionid');

推薦教程:《oracle

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享