Qual é a diferença entre av $ view e seu equivalente dba_?

9

Qual é a diferença geral entre uma v$visão e seu dba_equivalente? Tome, por exemplo, v$tablespacee dba_tablespaces.

Apenas um aprendiz
fonte

Respostas:

13

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$
Adam Musch
fonte
3

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

Kris Johnston
fonte