type 11g database oracle rowid

database - 11g - rownum oracle



ROWID(oráculo): ¿tiene algún uso? (6)

Ahora sé un ejemplo para esto.

supongamos que tiene una tabla sin claves principales. entonces esta tabla puede tener filas duplicadas. ¿Cómo eliminarías las filas duplicadas pero conservas exactamente una de ese tipo?

Oracle proporciona ROWID como una especie de sustituto de la clave principal. Puede escribir una consulta anidada de tipo correlacionado [(agrupe por todas las columnas de la fila y tome MIN (ROWID) en cada grupo en la consulta interna, para cada grupo elimine las otras filas en el grupo en 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.

Mi entendimiento es que ROWID es un valor único para cada fila en el resultado devuelto por una consulta. ¿Por qué necesitamos este ROWID? (ya hay ROWNUM es ORACLE). ¿Alguien ha usado ROWID en la consulta SQL?


ROWID básicamente le permite tener dos filas con los mismos datos exactos. Si bien, normalmente desea que su clave principal sea un poco más significativa que una identificación de fila, es solo una manera simple de garantizar automáticamente la singularidad entre las filas.


ROWID identifica de manera única una fila dentro de una tabla. ROWNUM te da el número de fila de un resultado para 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. Mira este artículo 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 recuerdo):

  • OBJID El identificador único del objeto.
  • FILENO El número relativo del archivo de datos en el espacio de tablas.
  • BLOCKNO El número de bloque relativo en el archivo de datos después de la cabecera del archivo.
  • el ROWNUM El rownum relativo dentro del bloque.

Puede descomponer fácilmente el ROWID en sus campos compuestos (OBJID, FILENO, BLOCKNO, ROWNUM) utilizando la función SQL ROWIDTOCHAR (), o use:

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 el campo ROWNUM (o ROW en la consulta anterior) no es el mismo ROWNUM que la pseudocolumna SQL ROWNUM que utiliza en la consulta SELECT, que es solo el número generado dinámicamente de la fila en el conjunto de resultados.

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

ROWID es la ruta de acceso más directa al bloque en el que reside la fila e identifica de forma única la fila, ya que codifica el archivo único y el bloque exclusivo dentro de ese archivo y fila única dentro de ese bloque.

Más información:

Ver: notas de DBMS en formato ROWID

Nota:

Si tiene un poco de conocimiento sobre la forma en que Oracle estructura los archivos y bloques de bases de datos, y conoce alguna programación en C, podría fácilmente crear un programa que muestre los contenidos del bloque dados por ROWID (un 8k, o el tamaño de bloque que se use en la base de datos, bloque que comienza en fileheadersize + BLOCKNO * BLOCK_SIZE. El bloque contiene el encabezado del bloque y posteriormente (suponiendo que la tabla no esté en clústeres) el rowdir, que para cada fila proporciona el desplazamiento relativo dentro del bloque para cada fila. en la posición 0 dentro del rowdir está el desplazamiento relativo de la fila 0-th dentro del bloque, en la posición 1 dentro del rowdir la posición relativa de la fila 1-st, etc. El número de filas se almacena en algún lugar del encabezado del bloque (Consulte la documentación de Orale en el diseño del bloque).

Con un poco de conocimiento de programación y buscando la documentación en los archivos de la base de datos Oracle y bloques para el diseño exacto de los bloques, puede ver cómo se almacenan las filas en el disco, e incluso reconstruir todos los valores que la fila almacena 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 columna y el tamaño de bytes y luego el valor. Bytesize 0 significa que los datos de la columna están vacíos (o: NULL).


tenga en cuenta que ROWID no persiste en un ciclo de exportación e importación de la base de datos. NUNCA debes almacenar un rowid en tus tablas como valor clave.


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

La sintaxis Oracle SELECT ... FOR UPDATE usa implícitamente ROWID, cuando actualizamos la fila bloqueada usando WHERE CURRENT OF. Además, la tabla EXCEPTIONS (a la que se hace referencia cuando se aplican restricciones con la cláusula EXCEPTIONS INTO) tiene una columna ROW_ID. Esto nos permite identificar rápidamente las filas que están rompiendo nuestra restricción.

Este último ejemplo apunta a otro uso general: cuando estamos escribiendo una pieza genérica de código y necesitamos un mecanismo para almacenar UIDs sin preocupaciones con respecto al tipo de datos, claves compuestas, etc.

ROWNUM por otro lado es una pseudocolumna que etiqueta una fila en un conjunto de resultados dado. No tiene un significado permanente.

editar

El ROWID para un registro dado puede cambiar a lo largo de la vida útil de un sistema, por ejemplo a través de una reconstrucción de tabla. Además, si se elimina un registro, se podría otorgar un nuevo registro que ROWID. En consecuencia, los ROWID no son adecuados para su uso como UID a largo plazo. Pero son lo suficientemente buenos para su uso dentro de una transacción.