Frage

Mein Verständnis ist, dass die ROWID ist ein eindeutiger Wert für jede Zeile im Ergebnis von einer Abfrage zurückgegeben.

Warum brauchen wir diese ROWID? Es ist bereits die ROWNUM in ORACLE.

Haben Sie ein beliebiges verwendet ROWID in einer SQL-Abfrage?

War es hilfreich?

Lösung

ROWID ist der physikalische Ort einer Reihe. Folglich ist es der schnellste Weg, um eine Reihe von Ortung, schneller sogar als Primärschlüssel Lookup. So ist es bei bestimmten Arten von Geschäften nützlich sein können, wo wir ein paar Zeilen auswählen, speichern ihre ROWIDs und dann die gleichen Zeilen verwenden später die ROWIDs in where Klauseln für DML gegen.

Die Oracle SELECT ... FOR UPDATE Syntax implizit verwendet ROWID, wenn wir die gesperrte Zeile aktualisieren WHERE CURRENT OF. Auch die AUSNAHMEN Tabelle (referenziert, wenn Einschränkungen mit den Ausnahmen INTO-Klausel anwenden) eine Spalte ROW_ID. Dies ermöglicht es uns, schnell die Zeilen zu identifizieren, die unsere Einschränkung brechen.

Das letztgenannte Beispiel zeigt auf eine andere allgemeine Nutzung: wenn wir einige generische Stück Code schreiben und brauchen einen Mechanismus für die UIDs ohne Bedenken in Bezug auf Datentyp, zusammengesetzte Schlüssel speichern, usw.

ROWNUM auf der anderen Seite ist eine Pseudo-Spalte, welche Tags eine Zeile in einem gegebenen Ergebnismenge. Es hat keine dauerhafte Bedeutung.

Bearbeiten

Die ROWID für einen bestimmten Datensatz kann über die gesamte Lebensdauer eines Systems ändern, beispielsweise durch eine Tabelle wieder aufzubauen. Auch wenn ein Datensatz ein neuer Datensatz gelöscht wird, könnte das ROWID gegeben werden. Folglich sind ROWIDs für die Verwendung als UIDs auf lange Sicht nicht geeignet. Aber sie sind gut genug für den Einsatz innerhalb einer Transaktion.

Andere Tipps

ich nun ein Beispiel dafür kennen.

Angenommen, Sie Tabelle ohne Primärschlüssel haben. so kann diese Tabelle doppelte Zeilen haben. Wie würden Sie doppelte Zeilen löschen, aber genau eine dieser Art halten?

Oracle bietet ROWID als eine Art Ersatz für Primärschlüssel. Sie können eine verschachtelte Abfrage schreiben, die von korrelierten Typ ist [(Gruppe von allen Spalten in der Zeile und nehmen MIN (ROWID) in jeder Gruppe in innerer Abfrage für jede Gruppe der anderen Zeilen in der Gruppe in outerquery löschen)]

Beispiel

SQL> select * from employees;

       SSN NAME
---------- ----------
         1 helen
         1 helen
         2 helen
         2 peter
        10 sally
        11 null
        11 null
        12 null

8 rows selected.

SQL> delete from employees where ROWID NOT IN (select min(ROWID) from employees
group by ssn,name);

2 rows deleted.

SQL> select * from employees;

       SSN NAME
---------- ----------
         1 helen
         2 helen
         2 peter
        10 sally
        11 null
        12 null

6 rows selected.

Beachten Sie, dass ROWID nicht über eine Datenbank Export und Import Zyklus nicht bestehen bleiben. Sie sollten niemals einen Rowid in Ihren Tabellen als Schlüsselwert speichern.

ROWID identifiziert eindeutig eine Reihe in einer Tabelle. ROWNUM gibt Ihnen die Zeilennummer ein Ergebnis für eine bestimmte Abfrage. Die beiden sind sehr unterschiedlich und sind nicht austauschbar.

Auch gibt es ROW_NUMBER, die eine modernere Version von ROWNUM ist, und verhält sich etwas anders. Schauen Sie sich diesem Artikel , die den Unterschied erklärt.

Ein ROWID besteht aus (aber nicht unbedingt in dieser Reihenfolge, obwohl der ROWNUM Teil der letzte Teil der ROWID ist, soweit ich mich erinnere):

  • OBJID Der einzigartige indentifier des Objekts.
  • FILENO Die relative Zahl der Daten-Datei im Tabellenbereich.
  • die BlockNo Die relative Blocknummer in der Daten-Datei nach dem fileheader.
  • die ROWNUM Die relativen rownum innerhalb des Blockes.

Sie können leicht die ROWID in seinen zusammengesetzten Felder brechen (OBJID, FILENO, BlockNo, ROWNUM) durch die ROWIDTOCHAR mit () SQL-Funktion oder Verwendung:

    SQL> select DBMS_ROWID.ROWID_OBJECT(rowid) "OBJECT",
    2         DBMS_ROWID.ROWID_RELATIVE_FNO(rowid) "FILE",
    3         DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) "BLOCK",
    4         DBMS_ROWID.ROWID_ROW_NUMBER(rowid) "ROW"
    5  from dual
    6  /
        OBJECT       FILE      BLOCK        ROW
    ---------- ---------- ---------- ----------
           258          1       2082          0

Beachten Sie, dass das Feld ROWNUM (oder ROW in der obigen Abfrage) ist nicht die gleiche ROWNUM wie die SQL Pseudo-Spalte ROWNUM Sie in SELECT-Abfrage verwenden, die nur die dynamisch generierte rownumber der Reihe ist in der Ergebnismenge.

Beachten Sie, dass aufgrund dieser Implementierung Zeilen, Blöcke, Ausdehnungen und Segmente nicht transportierbar sind, ohne die ROWID zu brechen, die Ungültigmachungseinträge Indizes.

Die ROWID ist der direkteste Zugriffspfad zu dem Block, in dem die Reihe wohnt und die Zeile eindeutig indentifies, weil es die eindeutige Datei und einzigartigen Block in dieser Datei und einzigartige Reihe innerhalb dieses Blockes codiert.

Weitere Informationen:

Siehe: DBMS Hinweise auf ROWID Format

Hinweis:

Wenn Sie ein wenig Verständnis für die Art und Weise Oracle-Strukturen Datenbank-Dateien und blockiert haben, und einige C-Programmierung kennen, können Sie ganz einfach ein Programm, dass zeigt den Inhalt des Blocks von ROWID gegeben (ein 8K, oder was auch immer Blockgröße in der Datenbank verwendet wird, Block, die beginnt, bei fileheadersize + BlockNo * BLOCK_SIZE. der Block enthält den Bausteinkopf und danach (in der Tabelle unter der Annahme, geclustert ist nicht), um die rowdir, das für jede Reihe die relative innerhalb des Blocks für jede Reihe versetzt gibt. so kann beispielsweise an der Position 0 innerhalb der rowdir ist der relative Versatz der 0-ten Zeile in dem Block an der Position 1 innerhalb der rowdir die relative Position der 1-st Reihe, usw. die Anzahl der Zeilen selbst irgendwo gespeichert wird in die Block-Header (Orale Dokumentation auf dem Block Layout sehen).

Mit einem wenig Wissen der Programmierung und in die Dokumentation zu Oracle-Datenbank-Dateien für das genaue Layout der Blöcke eine Block suchen, können Sie sehen, wie Reihen auf der Festplatte gespeichert sind, und auch alle Werte der Reihe speichert für jede Spalte rekonstruieren . Jede Zeile enthält Metadaten für die Länge der Zeile und die Anzahl der Spalten, und für jede Spalte, eine Anzeige für die Art der Säule und die BYTESIZE und Ausbildung zum bernischen Wert. ByteSize 0 bedeutet, dass die Spaltendaten leer ist (oder: NULL).

ROWID im Grunde können Sie zwei Reihen mit den exakt gleichen Daten haben. Während normalerweise Sie Ihr Primärschlüssel ein wenig aussagekräftiger als ein RowID sein wollen, ist es nur eine einfache Art und Weise der Eindeutigkeit zwischen den Reihen automatisch gewährleistet ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top