この記事では、Oracle に関する関連知識を提供します。主に rowid に関する関連問題を紹介します。Oracle データベース テーブル内のデータの各行には一意の識別子があります。または rowid と呼ばれ、通常は Oracle 内で使用されます。データにアクセスするための情報です。皆様のお役に立てれば幸いです。
推奨チュートリアル: 「Oracle 学習チュートリアル 」
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
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';
说明:
从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 サイトの他の関連記事を参照してください。