¿Cuál es la diferencia entre av $ view y su equivalente dba_?

9

¿Cuál es la diferencia general entre una v$vista y su dba_equivalente? Tomemos, por ejemplo, v$tablespacey dba_tablespaces.

Solo un alumno
fuente

Respuestas:

13

La forma más fácil de pensarlo es:

  • DBA_ / USER_ / ALL_ las vistas se crean en el diccionario de datos; no están disponibles si la base de datos no está montada y abierta.

  • V$ las vistas tienden a ejecutarse contra la instancia y, por lo tanto, pueden estar disponibles si la base de datos no está montada, o no está montada y abierta, dependiendo de la naturaleza de la vista.

Usando tu ejemplo:

  • V$TABLESPACEes una vista sobre X$KCCTS, que es una estructura de memoria interna.
  • DBA_TABLESPACES es una vista en la tabla del diccionario de datos SYS.TS$
Adam Musch
fuente
3

Además de las diferencias que enumeró Adam Musch, hay algunas diferencias más entre las vistas dba_ y las vistas v $ que vale la pena mencionar, ya que son posibles trampas si no conoce estas diferencias:

1) La mayoría (pero no del todo) de las vistas v $ no son vistas técnicas, pero son sinónimos de v_ $ vistas. Esta es una distinción importante ya que no puede otorgar / revocar permisos contra sinónimos:

sqlplus / as sysdba

grant select on v$tablespace to user1;
   SQL Error: ORA-02030: can only select from fixed tables/views

select table_name from dba_synonyms where synonym_name = 'V$TABLESPACE';
   TABLE_NAME
   -------------
   V_$TABLESPACE

grant select on V_$TABLESPACE to user1;
   grant succeeded.

2) Puede ejecutar consultas de flashback contra dba_ views. Sin embargo, la ejecución de consultas de flashback contra vistas $ v devuelve datos actuales (12.1 documentación sobre el uso de Oracle Flashback Tecnología) :

No puede recuperar datos pasados ​​de una vista de rendimiento dinámico (V $). Una consulta en dicha vista devuelve datos actuales.

Puede realizar consultas sobre datos pasados ​​en vistas de diccionario de datos estáticos, como * _TABLES.

Como señaló Adam Musch, v $ views se ejecutan directamente contra la instancia, mientras que dba_ views se ejecutan contra el diccionario de datos. Una vez que entiendes eso, tiene sentido por qué esta limitación está en su lugar. Sin embargo, realmente deseo que la consulta de flashback contra v $ views devuelva un error en lugar de no funcionar silenciosamente, ya que este problema puede pasar desapercibido durante bastante tiempo ...

Kris Johnston
fuente