Quelle est la différence générale entre une v$
vue et son dba_
équivalent? Prenez, par exemple, v$tablespace
et dba_tablespaces
.
La façon la plus simple d'y penser est:
DBA_ / USER_ / ALL_
les vues sont construites sur le dictionnaire de données - elles ne sont pas disponibles si la base de données n'est pas montée et ouverte.
V$
les vues ont tendance à s'exécuter sur l'instance et peuvent donc être disponibles si la base de données n'est pas montée, ou n'est pas montée et ouverte, selon la nature de la vue.
En utilisant votre exemple:
V$TABLESPACE
est une vue sur X$KCCTS
, qui est une structure de mémoire interne. DBA_TABLESPACES
est une vue sur la table du dictionnaire de données SYS.TS$
Outre les différences répertoriées par Adam Musch, il existe quelques différences supplémentaires entre les vues dba_ et les vues v $ qui méritent d'être mentionnées car elles sont des pièges potentiels si vous n'êtes pas au courant de ces différences:
1) La plupart (mais pas tout à fait) des vues v $ ne sont pas du tout techniquement des vues, mais sont synonymes de vues v_ $. Il s'agit d'une distinction importante car vous ne pouvez pas accorder / révoquer des autorisations sur des synonymes:
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) Vous pouvez exécuter des requêtes flashback sur les vues dba_. Cependant, l'exécution de requêtes flashback sur v $ views renvoie les données actuelles (12,1 documents sur l'utilisation de la technologie Oracle Flashback) :
Vous ne pouvez pas récupérer des données antérieures à partir d'une vue de performances dynamiques (V $). Une requête sur une telle vue renvoie les données actuelles.
Vous pouvez effectuer des requêtes sur des données antérieures dans des vues de dictionnaire de données statiques, telles que * _TABLES.
Comme l'a souligné Adam Musch, les vues v $ s'exécutent directement sur l'instance tandis que les vues dba_ s'exécutent sur le dictionnaire de données. Une fois que vous comprenez cela, il est logique de savoir pourquoi cette limitation est en place. Cependant, je souhaite vraiment que la requête flashback contre les vues v $ renvoie une erreur au lieu de ne pas fonctionner silencieusement car ce problème peut rester inaperçu pendant un certain temps ...