¿Cuál es la diferencia general entre una v$
vista y su dba_
equivalente? Tomemos, por ejemplo, v$tablespace
y dba_tablespaces
.
¿Cuál es la diferencia general entre una v$
vista y su dba_
equivalente? Tomemos, por ejemplo, v$tablespace
y dba_tablespaces
.
Respuestas:
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$TABLESPACE
es 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$
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 ...