Qual è la differenza generale tra una v$
vista e il suo dba_
equivalente? Prendi, per esempio, v$tablespace
e dba_tablespaces
.
Qual è la differenza generale tra una v$
vista e il suo dba_
equivalente? Prendi, per esempio, v$tablespace
e dba_tablespaces
.
Risposte:
Il modo più semplice di pensarci è:
DBA_ / USER_ / ALL_
le viste sono costruite sul dizionario dei dati - non sono disponibili se il database non è montato e aperto.
V$
le viste tendono a essere eseguite sull'istanza e pertanto potrebbero essere disponibili se il database non è montato o non è montato e aperto, a seconda della natura della vista.
Usando il tuo esempio:
V$TABLESPACE
è una vista su X$KCCTS
, che è una struttura di memoria interna. DBA_TABLESPACES
è una vista sulla tabella del dizionario dei dati SYS.TS$
Oltre alle differenze elencate da Adam Musch, ci sono alcune differenze tra le viste dba_ e v $ che vale la pena menzionare poiché sono potenziali gotcha se non si è consapevoli di queste differenze:
1) La maggior parte (ma non del tutto) v $ viste non sono tecnicamente viste, ma sono sinonimi di v_ $ viste. Questa è una distinzione importante poiché non è possibile concedere / revocare autorizzazioni per sinonimi:
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) È possibile eseguire query di flashback su viste dba_. Tuttavia, l'esecuzione di query di flashback su v $ views restituisce i dati correnti (12.1 documenti sull'utilizzo della tecnologia Oracle Flashback) :
Non è possibile recuperare i dati passati da una vista delle prestazioni dinamiche (V $). Una query su tale vista restituisce i dati correnti.
È possibile eseguire query su dati passati in viste del dizionario di dati statici, come * _TABLES.
Come ha sottolineato Adam Musch, v $ views viene eseguito direttamente sull'istanza mentre dba_ views viene eseguito sul dizionario dei dati. Una volta capito, ha senso il motivo per cui questa limitazione è in atto. Tuttavia, vorrei davvero che la query di flashback contro v $ views restituisse un errore invece di non funzionare in silenzio poiché questo gotcha può rimanere inosservato per un bel po 'di tempo ...