2009-01-12 5 views
13

AFAIK ROWID dans Oracle représente l'emplacement physique d'un enregistrement dans un fichier de données approprié. Dans quels cas ROWID d'un enregistrement peut-il changer?Qu'est-ce qui peut provoquer le changement d'un Oracle ROWID?

Celui que je connais est UPDATE sur une table partitionnée qui "déplace" l'enregistrement vers une autre partition.

Y a-t-il un autre cas? La plupart de nos blocs de données sont Oracle 10.

Répondre

30

Comme vous l'avez dit, il se produit chaque fois que la ligne est déplacé physiquement sur le disque, tels que:

  • Exportation/importation de la table
  • ALTER TABLE XXXX DÉMÉNAGEMENT
  • ALTER TABLE XXXX RÉTRACTILE SPACE
  • FLASHBACK TABLEAU XXXX
  • Fractionnement d'une partition
  • Mise à jour d'une valeur de sorte qu'elle se déplace à une nouvelle partition
  • La combinaison de deux partitions

Si est dans un index tableau organisé, puis une mise à jour à la clé primaire vous donnera un ROWID différent aussi.

+1

En outre, UPDATEing (une valeur précédemment NULL, disons) peut rendre la ligne assez grande pour qu'elle ne puisse plus être hébergée sur sa page actuelle. Dans une application où un grand nombre de UPDATEs se produisent, ce serait probablement assez commun. –

+2

Mike, cela conduirait à enchaîner les rangs. Le ROWID apparent de la ligne ne change pas, mais dans l'enregistrement, vous obtenez un pointeur vers un autre bloc où l'enregistrement complet est placé. –

+2

Il s'agirait d'une migration de ligne, qui se produit lorsque la ligne devient trop grande pour le bloc en cours mais suffisamment grande pour être contenue dans un seul bloc. Le chaînage se produit lorsque la ligne est trop grande pour un seul bloc. Mais vous avez raison, un pointeur sur une ligne migrée est laissé dans le bloc d'origine. –

8

+1 @WW

En aparté:

ROWID pour les tables d'index organisés sont différents (ils sont appelés UROWID, je crois), parce que l'emplacement physique de la ligne peut changer au cours de mises à jour de la table (lorsque les nœuds de l'arbre sont séparés ou sont joints). Afin de rendre l'indexation encore possible, l'UROWID inclut "l'ID logique" (la clé primaire), et "l'ID physique probable" (un ROWID normal), dont le dernier peut être expiré.

8

Un autre +1 à WW, mais juste d'ajouter un peu plus ...

Si la question est de savoir si la conduite que vous pouvez stocker ROWIDs pour une utilisation ultérieure, je dirais que « ne le font pas ».

Vous êtes bien d'utiliser ROWIDs dans une transaction - par exemple la collecte d'un ensemble de ROWIDs sur lequel effectuer une des opérations ultérieures - mais vous ne devriez jamais magasin les ROWIDs dans une table et suppose qu'ils vous allez être ok pour utiliser à une date ultérieure.

+0

En utilisant la fonctionnalité de notification de modification de la base de données Oracle, les seules informations que le pilote Oracle jdbc expose lorsque la ligne est modifiée sont ROWID. Je crois, en s'appuyant sur ROWID est une solution stable. Si vous n'allez pas modifier votre table entre les transactions. – Anton

Questions connexes