Pregunta

Simplemente me gustaría escuchar diferentes opiniones sobre el uso del tipo de ROWID como parámetro de entrada de cualquier función o procedimiento.

Normalmente he usado y visto claves primarias utilizadas como parámetros de entrada, pero ¿hay algún tipo de desventajas para usar ROWID como parámetro de entrada? Creo que es un tipo simple y las seleccionar son bastante rápidas si se usan en la cláusula Where.

Por ejemplo:

FUNCTION get_row(p_rowid IN ROWID) RETURN TABLE%ROWTYPE IS...
¿Fue útil?

Solución

Desde el guía conceptual:

Los ROWID físicos proporcionan el acceso más rápido posible a una fila de una tabla determinada. Contienen la dirección física de una fila (hasta el bloque específico) y le permiten recuperar la fila en un solo bloque de acceso. Oracle garantiza que mientras exista la fila, su rowid no cambia.

El principal inconveniente de un ROWID es que, si bien es normalmente estable, puede cambiar en algunas circunstancias:

  • La mesa es reconstruida (ALTER TABLE MOVE...)
  • Exportar / importar obviamente
  • Tabla de partición con movimiento de fila habilitando

Una clave principal identifica una fila lógicamente, siempre encontrará la fila correcta, incluso después de un Delete+Insert. Un rowid identifica la fila físicamente y no es tan persistente como una clave principal.

Puede usar ROWID de forma segura en una sola instrucción SQL, ya que Oracle garantizará que el resultado sea coherente, por ejemplo, para eliminar los duplicados en una tabla. Para estar en el lado seguro, le sugiero que solo use el rowid declaraciones acumuladas Cuando tenga un bloqueo en la fila (seleccione ... para actualizar).

Desde el punto de vista de rendimiento, el acceso a la clave principal es un poco más costoso, pero normalmente lo notará solo si realiza mucho acceso de una sola fila. Sin embargo, si el rendimiento es crítico, generalmente puede obtener un mayor beneficio en ese caso al usar el procesamiento de establecimiento que el procesamiento de una sola fila con ROWID. En particular, si hay muchos viajes redondos entre el DB y la aplicación, el costo del acceso a la fila probablemente será insignificante en comparación con el costo de las triunfos redondos.

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