Quelle est la différence entre av $ view et son équivalent dba_?

9

Quelle est la différence générale entre une v$vue et son dba_équivalent? Prenez, par exemple, v$tablespaceet dba_tablespaces.

Juste un apprenant
la source

Réponses:

13

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$TABLESPACEest 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$
Adam Musch
la source
3

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 ...

Kris Johnston
la source