ホームページ > データベース > Oracle > Oracle Study GuideのROWIDの詳細な説明

Oracle Study GuideのROWIDの詳細な説明

WBOY
リリース: 2022-03-15 20:04:55
転載
3420 人が閲覧しました

この記事では、Oracle に関する関連知識を提供します。主に rowid に関する関連問題を紹介します。Oracle データベース テーブル内のデータの各行には一意の識別子があります。または rowid と呼ばれ、通常は Oracle 内で使用されます。データにアクセスするための情報です。皆様のお役に立てれば幸いです。

Oracle Study GuideのROWIDの詳細な説明

推奨チュートリアル: 「Oracle 学習チュートリアル

1. rowid への情報の保存の概要

oracleデータベース テーブル内のデータの各行には一意の識別子 (ROWID) があり、通常は Oracle 内のデータにアクセスするために使用されます。 rowid は 10 バイトの記憶領域を必要とし、表示に 18 文字を使用します。この値は、Oracle データベース内の行の特定の物理的な場所を示します。 ROWID をクエリで使用すると、値がクエリ結果に含まれることを示すことができます。

ROWID の保存には 10 バイトまたは 80 バイナリ ビットが必要です。拡張 ROWID は、obj#32bit、rfile#10bit、block#22bit、row#16bit を含む合計 80 ビットの 10 バイトに格納されます。したがって、相対ファイル番号は 1023 を超えることはできません。つまり、表スペース内のデータ ファイルの数は 1023 を超えることはできません (ファイル番号 0 のファイルはありません)。データファイルには 2^22=4M ブロックしか含めることができません。 1 つのブロックには 1023 を超えるブロックを含めることができ、2^16=64K 行のデータになります。データベースには 2^32=4G を超えるオブジェクトを含めることはできません。
これらの 80 バイナリ ビットは次のとおりです:
1. データ オブジェクト番号。この行が属するデータベース オブジェクトの番号を示します。データベースの作成時に各データ オブジェクトには一意に番号が割り当てられ、この番号は一意です。データ オブジェクト番号は約 32 ビットを占めます。
2. 対応するファイル番号。行が配置されているファイルの番号を示します。表スペース内の各ファイル ラベルは一意です。ファイル番号は 10 桁です。
3. ブロック番号。行がリダイレクトされるファイルのブロックの位置を示します。ブロック番号には 22 桁が必要です。
4. 行番号。行ディレクトリ内の行の特定の位置を示します。行番号には 16 桁が必要です。
これは合計 80 ビットになります。

注: Oracle 8 バージョンより前では、ROWID は file# block# row# で構成され、6 バイトの領域を占有し、10 ビット file#、22 ビット block#、16 ビット row# で構成されていました。 Oracle8 以降のバージョンでは、スペースが 10 バイトに変更されます。

Oracle の物理拡張 ROWID は 18 ビットで、各ビットは A ~ Z、a ~ z、0 ~ 9、、、/ A を使用して 64 ビットでエンコードされます。合計 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 バイト (32 ビットのオブジェクト番号、10 ビットの rfile#、22 ビットのブロック番号、および 16 ビットの行番号を含む) であることを確認します。ダンプ機能を使用する必要があります。

select rowid,dump(rowid,16) from DEPT
ログイン後にコピー

2. 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 は空です。例: (プロシージャ、関数、パッケージ、データ型、DB リンク、MV 定義、ビュー定義、一時テーブル、パーティション テーブル定義など)

ほとんどの場合、この 2 つは等しいです。ただし、オブジェクトに対して切り捨て、移動、再構築などの操作を実行すると、data_object_id は変更されますが、object_id は変更されません。

ターゲット DEPT で切り捨て操作を実行します。コード: TRUNCATE TABLE DEPT;

結果を再度クエリします:

truncate 操作を置き換えます。 データを表に再挿入し、オブジェクト番号を表す ROWID が AAUOO から 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 Study GuideのROWIDの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート