Question

Ma compréhension est que le ROWID est une valeur unique pour chaque ligne dans le résultat retourné par une requête.

Pourquoi avons-nous besoin de cette ROWID? Il y a déjà le ROWNUM dans ORACLE.

Pour toute une ROWID utilisée dans une requête SQL?

Était-ce utile?

La solution

ROWID est l'emplacement physique d'une ligne. Par conséquent, il est le moyen le plus rapide de localiser une rangée, plus rapide même qu'une recherche clé primaire. Ainsi, il peut être utile dans certains types de transactions où nous sélectionnons quelques lignes, stocker leurs ROWIDs, puis plus tard utiliser les ROWIDs dans les clauses de where pour DML contre ces mêmes lignes.

L'Oracle SELECT ... FOR UPDATE syntaxe utilise implicitement ROWID, lorsque nous mettons à jour la ligne verrouillée en utilisant WHERE CURRENT OF. Aussi la table EXCEPTIONS (référencé lors de l'application des contraintes avec les EXCEPTIONS clause INTO) a une ROW_ID de colonne. Cela nous permet d'identifier rapidement les lignes qui enfreignent notre contrainte.

Ce dernier point par exemple à un autre usage général: quand nous écrivons une pièce générique de code et besoin d'un mécanisme de stockage sans UIDs préoccupations concernant le type de données, les clés composites, etc.

ROWNUM d'autre part est une pseudo-colonne qui les balises d'une ligne dans un jeu de résultats donné. Il n'a pas de signification permanente.

modifier

Le ROWID pour un enregistrement donné peut changer au cours de la durée de vie d'un système, par exemple par une reconstruction table. De plus, si un enregistrement est supprimé un nouveau record pourrait être donné que ROWID. Par conséquent ROWIDs ne conviennent pas pour une utilisation comme UIDs à ??long terme. Mais ils sont assez bons pour une utilisation dans une transaction.

Autres conseils

Je sais maintenant un exemple pour cela.

supposons que vous avez table sans clé primaire. donc ce tableau peut avoir des lignes en double. Comment voulez-vous supprimer les doublons mais gardez exactement un de ce genre?

Oracle fournit ROWID comme une sorte de substitut à la clé primaire. Vous pouvez écrire une requête imbriquée qui est de type corrélé [(groupe par toutes les colonnes de la rangée et de prendre MIN (ROWID) dans chaque groupe dans la requête interne, pour chaque groupe de supprimer les autres lignes dans le groupe de outerquery)]

Exemple

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.

Notez que ROWID ne persiste pas dans une base de données et le cycle EXPORT IMPORT. vous ne devriez jamais stocker un rowid dans vos tableaux comme une valeur clé.

ROWID identifie de manière unique une ligne dans une table. ROWNUM vous donne le numéro de ligne d'un résultat pour une requête spécifique. Les deux sont très différents et ne sont pas interchangeables.

Il y a également ROW_NUMBER qui est une version plus moderne de ROWNUM, et se comporte un peu différemment. Consultez cet article qui explique la différence.

Un ROWID se compose de (mais pas nécessairement dans cet ordre, bien que la partie ROWNUM est la dernière partie de ROWID pour autant que je me souviens):

  • OBJID Le indentifier unique de l'objet.
  • FILENO Le nombre relatif du fichier de données dans le tablespace.
  • BLOCKNO Le numéro de bloc relatif dans le fichier de données après la FileHeader.
  • ROWNUM La rownum relative à l'intérieur du bloc.

Vous pouvez facilement briser ROWID dans ses champs composites (OBJID, FILENO, BLOCKNO, ROWNUM) en utilisant le ROWIDTOCHAR () SQL-fonction ou de l'utilisation:

    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

Notez que le ROWNUM sur le terrain (ou une ligne dans la requête ci-dessus) est pas la même ROWNUM que la colonne pseudo SQL ROWNUM que vous utilisez dans la requête SELECT, qui est juste le rownumber généré dynamiquement de la ligne dans le jeu de résultats.

Notez qu'en raison de cette mise en œuvre, des lignes, des blocs, des degrés et des segments ne sont pas transportables sans casser la ROWID, qui indexe des Invalide.

Le ROWID est le plus chemin d'accès direct au bloc dans lequel se trouve une rangée et indentifies unique la ligne, car elle code pour le fichier unique et bloc unique au sein de ce fichier et rangée unique dans ce bloc.

Plus d'informations:

Voir: notes SGBD sur le format ROWID

Note:

Si vous avez un peu de compréhension des fichiers de base de données de structures d'oracle façon et les blocs, et connaissez un peu de programmation C, vous pouvez faire assez facilement un programme qui affiche le contenu du bloc donné par ROWID (un 8k, ou quelle que soit la taille du bloc est utilisé dans la base de données, le bloc qui commence à fileheadersize + BLOCKNO * BLOCK_SIZE. le bloc contient l'en-tête de bloc et par la suite (en supposant que la table ne soit pas aggloméré) le rowdir, qui, pour chaque ligne donne le décalage relatif dans le bloc pour chaque ligne. Ainsi, par exemple à la position 0 au sein de la rowdir est le décalage relatif de la 0-ième rangée dans le bloc, en position 1 à l'intérieur de la rowdir la position relative de la rangée 1-st, etc. le nombre de lignes lui-même est stocké quelque part dans l'en-tête de bloc (Voir la documentation sur la mise en page orale de bloc).

Avec un peu de connaissances en programmation et à la recherche la documentation sur les fichiers base de données Oracle un des blocs pour la mise en page exacte des blocs, vous pouvez voir comment les lignes sont stockées sur le disque, et à reconstruire même toutes les valeurs des magasins de ligne pour chaque colonne . Chaque ligne contient des métadonnées pour la longueur de la ligne et le nombre de colonnes, et pour chaque colonne, l'indication pour le type de la colonne et la bytesize et therafter la valeur. Bytesize 0 signifie que les données de colonne est vide (ou: NULL).

ROWID vous permet essentiellement d'avoir deux lignes avec exactement les mêmes données. Alors que, vous voulez généralement votre clé primaire d'être un peu plus significatif qu'un RowID, il est juste un moyen simple d'assurer automatiquement l'unicité entre les lignes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top