Heim  >  Artikel  >  Datenbank  >  Ausführliche Erklärung von rowid im Oracle Study Guide

Ausführliche Erklärung von rowid im Oracle Study Guide

WBOY
WBOYnach vorne
2022-03-15 18:03:143249Durchsuche

Dieser Artikel bringt Ihnen relevantes Wissen über Oracle, das hauptsächlich verwandte Probleme mit der Row-ID einführt. Jede Datenzeile in der Oracle-Datenbanktabelle hat eine eindeutige Kennung oder Row-ID, die in Oracle normalerweise intern verwendet wird, um auf Daten zuzugreifen wird für alle hilfreich sein.

Ausführliche Erklärung von rowid im Oracle Study Guide

Empfohlenes Tutorial: „Oracle Learning Tutorial

1. Übersicht über die in der Rowid gespeicherten Informationen

Jede Datenzeile in der Tabelle der Oracle-Datenbank hat in Oracle eine eindeutige Kennung oder Rowid Wird normalerweise intern für den Zugriff auf Daten verwendet. rowid benötigt 10 Byte Speicherplatz und verwendet 18 Zeichen zur Anzeige. Dieser Wert gibt den spezifischen physischen Speicherort der Zeile in der Oracle-Datenbank an. Rowid kann in einer Abfrage verwendet werden, um anzugeben, dass der Wert in den Abfrageergebnissen enthalten ist.

      Das Speichern der Rowid erfordert 10 Bytes oder 80 Binärbits. Eine erweiterte Zeilen-ID wird in 10 Bytes mit insgesamt 80 Bits gespeichert, einschließlich obj#32bit, rfile#10bit, block#22bit und row#16bit. Daher darf die relative Dateinummer 1023 nicht überschreiten, d. h. die Anzahl der Datendateien in einem Tabellenbereich darf 1023 nicht überschreiten (es gibt keine Datei mit der Dateinummer 0. Eine Datendatei kann nur 2 ^ 22 = 4 MB Blöcke haben In einem Block können mehr als 1023 Blöcke mit 2^16=64K Datenzeilen enthalten sein. Eine Datenbank darf nicht mehr als 2^32=4G-Objekte enthalten.
Diese 80 Binärbits sind:
1. Datenobjektnummer, die die Nummer des Datenbankobjekts angibt, zu dem diese Zeile gehört. Jedem Datenobjekt wird beim Erstellen der Datenbank eindeutig eine Nummer zugewiesen, und diese Nummer ist eindeutig. Die Datenobjektnummer belegt ca. 32 Bit.
2. Entsprechende Dateinummer, die die Nummer der Datei angibt, in der sich die Zeile befindet. Jede Dateibezeichnung im Tabellenbereich ist eindeutig. Das Aktenzeichen ist 10-stellig.
3. Blocknummer, die den Speicherort des Blocks der Datei angibt, in den die Zeile umgeleitet wird. Die Blocknummer erfordert 22 Ziffern.
4. Zeilennummer, die die spezifische Position der Zeile im Zeilenverzeichnis angibt. Die Zeilennummer erfordert 16 Ziffern.
Das ergibt insgesamt 80 Ziffern.

Hinweis: Vor Oracle Version 8 bestand die Zeilen-ID aus Datei#, Block#, Zeilennummer, die 6 Byte Speicherplatz belegte, 10 Bit Datei#, 22 Bit Block# und 16 Bit Zeilen#. Oracle8 und spätere Versionen ändern den Speicherplatz auf 10 Byte.

Oracles physische erweiterte ROWID hat 18 Bit, jedes Bit ist in 64 Bit codiert und wird durch A~Z, a~z, 0~9, +, /, insgesamt 64 Zeichen, dargestellt. A steht für 0, B steht für 1, ... Z steht für 25, a steht für 26, ... z steht für 51, 0 steht für 52, ..., 9 steht für 61, + steht für 62, / steht für 63.

SELECT T.ROWID, T.* FROM DEPT T

Um zu überprüfen, ob der Speicherplatz der Zeilen-ID 10 Byte beträgt, einschließlich 32-Bit-Objektnummer, 10-Bit-Dateinummer, 22-Bit-Blocknummer und 16-Bit-Zeilennummer. Wir müssen die Dump-Funktion verwenden.

select rowid,dump(rowid,16) from DEPT

2. Überprüfen und zeigen Sie den Rowid-Inhalt an

1. Verwenden Sie die Funktion im dbms_rowid-Paket, um

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;

Die Ergebnisse sind wie folgt:

2. Fragen Sie Dateninformationen aus der Tabelle ab

1) Abfrageobjektnummer: 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';

Die Ergebnisse sind wie folgt:

Erklärung: Der Unterschied zwischen DATA_OBJECT_ID und OBJECT_ID

object_id und data_object_id sind beide eindeutige Bezeichner von Objekten.

object_id ist die logische Identifikation des Objekts

data_object_id ist die physische Identifikation des Objekts

Nur Objekte mit tatsächlichen physischen Speicherorten wie Tabellen, Indizes und Undo haben data_object_id. Bei Objekten ohne physischen Speicher ist data_object_id leer. Zum Beispiel: (Prozedur, Funktion, Paket, Datentyp, DB-Link, MV-Definition, Ansichtsdefinition, temporäre Tabelle, Partitionstabellendefinition usw.)

In den meisten Fällen sind die beiden gleich. Nachdem jedoch das Objekt abgeschnitten, verschoben, neu erstellt und andere Vorgänge ausgeführt wurden, ändert sich die data_object_id, die object_id jedoch nicht.

Führen Sie den Abschneidevorgang für die Ziel-DEPT aus, Code: TRUNCATE TABLE DEPT;

Fragen Sie die Ergebnisse erneut ab:

Fügen Sie die Daten vor dem Abschneiden erneut in die Tabelle ein und überprüfen Sie, ob der Teil der Zeilen-ID die Objektnummer darstellt hat sich von AAAUOO zu AAAUOP geändert und um 1 erhöht.

2) Abfragedateinummer:

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: Die erste Datenblocknummer dieser Tabelle

BLOCKS: Die Anzahl der Datenblöcke dieser Tabelle

RELATIVE_FNO: Relative Dateinummer

Die Ergebnisse sind wie folgt :

说明:

从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教程

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung von rowid im Oracle Study Guide. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen