首頁 >資料庫 >Oracle >Oracle學習指南之rowid詳解

Oracle學習指南之rowid詳解

WBOY
WBOY轉載
2022-03-15 18:03:143422瀏覽

本篇文章為大家帶來了關於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有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

為了驗證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;

結果如下:

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';

結果如下:

# #說明: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;

再次查詢結果:

將truncate前資料重新插入表中,查看rowid代表物件號碼的部分已發生變化由AAAUOO變為AAAUOP,增加了1。

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:相對檔案編號

###結果如下:###

说明:

从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';

执行结果:

因为创建用户时没用指定默认表空间,建表时也没用指定表空间,所以此处使用的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教程

以上是Oracle學習指南之rowid詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除