Qual é a diferença geral entre uma v$
visão e seu dba_
equivalente? Tome, por exemplo, v$tablespace
e dba_tablespaces
.
Qual é a diferença geral entre uma v$
visão e seu dba_
equivalente? Tome, por exemplo, v$tablespace
e dba_tablespaces
.
Respostas:
A maneira mais fácil de pensar nisso é:
DBA_ / USER_ / ALL_
as visualizações são criadas no dicionário de dados - elas não estarão disponíveis se o banco de dados não estiver montado e aberto.
V$
as visualizações tendem a ser executadas na instância e, portanto, podem estar disponíveis se o banco de dados não estiver montado ou não estiver montado e aberto, dependendo da natureza da visualização.
Usando seu exemplo:
V$TABLESPACE
é uma visão sobre X$KCCTS
, que é uma estrutura de memória interna. DBA_TABLESPACES
é uma visualização na tabela do dicionário de dados SYS.TS$
Além das diferenças listadas por Adam Musch, existem mais algumas diferenças entre as visualizações dba_ e v $ que vale a pena mencionar, pois são possíveis dicas se você não estiver ciente dessas diferenças:
1) A maioria (mas não a totalidade) das visualizações v $ não são tecnicamente visualizações, mas são sinônimos das visualizações v_ $. Essa é uma distinção importante, pois você não pode conceder / revogar permissões 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) Você pode executar consultas de flashback nas visualizações dba_. No entanto, a execução de consultas de flashback nas visualizações v $ retorna dados atuais (12.1 documentos sobre o uso da tecnologia Oracle Flashback) :
Você não pode recuperar dados passados de uma exibição de desempenho dinâmico (V $). Uma consulta em uma exibição desse tipo retorna dados atuais.
Você pode executar consultas sobre dados passados em visualizações de dicionário de dados estáticos, como * _TABLES.
Como apontou Adam Musch, as visualizações v $ são executadas diretamente na instância, enquanto as visualizações dba_ são executadas no dicionário de dados. Depois de entender isso, faz sentido o porquê dessa limitação. Ainda assim, eu realmente desejo que a consulta de flashback em visualizações v $ retorne um erro em vez de silenciosamente não funcionar, pois essa pegadinha pode permanecer despercebida por algum tempo ...