Pregunta

Mi entendimiento es que el ROWID es un valor único para cada fila en el resultado devuelto por una consulta.

¿Por qué necesitamos esta ROWID? Ya existe la ROWNUM en ORACLE.

¿Alguno uno ROWID utiliza en una consulta SQL?

¿Fue útil?

Solución

ROWID es la ubicación física de una fila. En consecuencia, es la manera más rápida de localizar una fila, más rápido incluso que una búsqueda de la clave principal. Por lo que puede ser útil en ciertos tipos de transacción en la que seleccionamos algunas filas, almacenar sus ROWIDs y luego utilizar más adelante en las cláusulas ROWIDs en where para DML contra esas mismas filas.

El Oracle SELECT ... FOR sintaxis ACTUALIZACIÓN utiliza implícitamente ROWID, cuando actualizamos la fila bloqueada usando DE WHERE CURRENT. También la tabla excepciones (referenciado al aplicar limitaciones con las excepciones cláusula INTO) tiene una ROW_ID columna. Esto nos permite identificar rápidamente las filas que se abren nuestra limitación.

Ese ejemplo últimos puntos a otro uso general: cuando estamos escribiendo alguna pieza genérica de código y necesitamos un mecanismo para almacenar los UID y sin preocupaciones en cuanto al tipo de datos, claves compuestas, etc.

ROWNUM por otro lado es un pseudo-columna que etiqueta una fila en un conjunto de resultados dado. No tiene ninguna importancia permanente.

editar

El ROWID para un registro dado puede cambiar durante la vida útil de un sistema, por ejemplo a través de una mesa de reconstruir. Además, si se elimina un registro de un nuevo registro se podría dar que ROWID. En consecuencia ROWIDs no son adecuados para su uso como UIDs en el largo plazo. Pero son lo suficientemente bueno para su uso dentro de una transacción.

Otros consejos

ahora sé un ejemplo para esto.

suponga que tiene tabla sin claves primarias. por lo que esta tabla puede tener filas duplicadas. ¿Cómo te eliminar filas duplicadas pero mantener exactamente una de ese tipo?

Oracle proporciona ROWID como una especie de sustituto de la clave primaria. Puede escribir una consulta anidada que es de tipo correlacionada [(grupo por todas las columnas de la fila y tomar MIN (ROWID) en cada grupo de consulta interna, para cada grupo de eliminar las otras filas en el grupo de outerquery)]

Ejemplo

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.

Tenga en cuenta que ROWID no persiste a través de una base de datos exporta y el ciclo de importación. NUNCA debe almacenar un ID de fila en las tablas como un valor clave.

ROWID identifica de forma única una fila dentro de una tabla. ROWNUM le da el número de fila del resultado de una consulta específica. Los dos son muy diferentes y no son intercambiables.

También hay ROW_NUMBER que es una versión más moderna de ROWNUM, y se comporta de forma ligeramente diferente. Echa un vistazo a este artículo lo que explica la diferencia.

Un ROWID consiste en (pero no necesariamente en ese orden, aunque la parte ROWNUM es la última parte de ROWID por lo que yo recuerdo):

  • OBJID El indentifier único del objeto.
  • FILENO El número relativo del archivo de datos en el espacio de tabla.
  • el BlockNo El número relativo de bloque en el archivo de datos después de la FileHeader.
  • el ROWNUM El rownum relativa dentro del bloque.

Puede romperse fácilmente por el ROWID en ella de campos compuestos (OBJID, FILENO, BlockNo, ROWNUM) mediante el uso de la ROWIDTOCHAR () SQL-función o uso:

    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

Tenga en cuenta que la ROWNUM campo (o fila de la consulta anterior) es no el mismo ROWNUM como el ROWNUM pseudo columna de SQL se utiliza en la consulta SELECT, que es sólo el rownumber generado dinámicamente de la fila en el conjunto de resultados.

Tenga en cuenta que debido a esta aplicación, filas, bloques, extensiones y segmentos no son transportables sin romper el ROWID, que invalida los índices.

El ROWID es la ruta de acceso directo más para el bloque en el que reside la fila y únicamente identifica la fila, debido a que codifica el archivo único y bloque único dentro de ese archivo y la fila única dentro de ese bloque.

Más información:

Ver: DBMS notas en formato ROWID

Nota:

Si usted tiene un poco de comprensión de los archivos de base de estructuras de Oracle vías y bloques, y saber algo de programación C, que podría fácilmente hacer un programa que muestra el contenido del bloque dado por ROWID (un 8k, o lo que sea el tamaño de bloque se utiliza en la base de datos, bloque que comienza en fileheadersize + BlockNo * BLOCK_SIZE. el bloque contiene la cabecera del bloque y, posteriormente, (suponiendo que la mesa no está agrupado) la rowdir, que para cada fila da el desplazamiento dentro del bloque para cada fila relativa. Así, por ejemplo en la posición 0 en el rowdir es el desplazamiento de la 0-ésima fila dentro del bloque relativa, en la posición 1 en el rowdir la posición relativa de la fila 1-st, etc. el número de filas en sí se almacena en algún lugar de la cabecera del bloque (véase la documentación orale en el diseño de bloque).

Con un poco de conocimientos de programación y mirando hacia arriba la documentación de la base de datos Oracle presenta una bloques para la disposición exacta de los bloques, se puede ver cómo se almacenan las filas en el disco, e incluso reconstruir todos los valores de las tiendas fila para cada columna . Cada fila contiene metadatos para la longitud de la fila y el número de columnas, y para cada columna, una indicación para el tipo de la columna y el ByteSize y después de este período el valor. ByteSize 0 significa que los datos de columna está vacío (o: NULL).

ROWID básicamente le permite tener dos filas con los mismos datos exactos. Aunque, por lo general quiere que su clave principal para ser un poco más significativo que un ROWID, es sólo una forma sencilla de garantizar la singularidad de forma automática entre las filas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top