2009-01-12 32 views
13

AFAIK ROWID en Oracle representa la ubicación física de un registro en el archivo de datos apropiado. ¿En qué casos ROWID de un registro puede cambiar?¿Qué puede hacer que cambie Oracle ROWID?

El que yo conozco está ACTUALIZADO en la tabla particionada que "mueve" el registro a otra partición.

¿Hay algún otro caso? La mayoría de nuestros DBs son Oracle 10.

Respuesta

30

Como usted ha dicho, que se produce en cualquier momento la fila se mueve físicamente en el disco, como por ejemplo:

  • de exportación/importación de la tabla
  • ALTER TABLE XXXX MOVER
  • ALTER TABLE XXXX ESPACIO Shrink
  • XXXX FLASHBACK TABLE
  • división de una partición
  • actualización de un valor para que se mueva a una nueva partición
  • La combinación de dos particiones

Si está en una tabla de índices organizados, a continuación, una actualización de la clave principal sería darle un ROWID diferentes también.

+1

Además, UPDATEing (un valor NULL anterior, por ejemplo) puede hacer que la fila sea lo suficientemente grande para que ya no pueda acomodarse en su página actual. En una aplicación donde se producen grandes cantidades de ACTUALIZACIONES, esto probablemente sea bastante común. –

+2

Mike, eso llevaría al encadenamiento de filas. El valor ROWID aparente de la fila no cambia, pero en el registro se obtiene un puntero a otro bloque donde se coloca el registro completo. –

+2

Sería una migración de fila, que ocurre cuando la fila crece demasiado para el bloque actual pero es lo suficientemente grande para estar contenida en un solo bloque. El encadenamiento ocurre cuando la fila es demasiado grande para un solo bloque. Pero tiene razón en que un puntero a una fila migrada queda en el bloque original. –

8

1 @WW

Como acotación al margen:

ROWID para las tablas de índice organizado son diferentes (se les llama UROWID, creo), debido a la ubicación física de la fila puede cambiar durante las actualizaciones de la tabla (cuando los nodos de árbol se dividen o se unen).

Para que la indexación siga siendo posible, UROWID incluye la "identificación lógica" (la clave principal) y la "probable identificación física" (una ROWID normal), la última de las cuales puede haber expirado.

8

Otro 1 a WW, pero sólo para añadir un poco más ...

Si la pregunta es si la conducción se puede almacenar para su uso posterior ROWIDs, diría "no lo hagas".

Estás bien usar ROWIDs dentro de una transacción - por ejemplo recopilar un conjunto de ROWIDs en el que llevar a cabo unas operaciones posteriores - pero nunca se debe tienda de los ROWIDs en una mesa y asumir que va a estar está bien para usar en una fecha posterior.

+0

Al utilizar la función de notificación de cambio de la base de datos Oracle, la única información que expone el controlador jdbc de Oracle cuando se cambia la fila es ROWID. Creo que confiar en ROWID es una solución estable. Si no vas a alterar tu tabla entre las transacciones. – Anton

Cuestiones relacionadas