回答:
それを考える最も簡単な方法は次のとおりです。
DBA_ / USER_ / ALL_
ビューはデータディクショナリに基づいて構築されています-データベースがマウントされておらず、開かれていない場合は使用できません。
V$
ビューはインスタンスに対して実行される傾向があるため、ビューの性質に応じて、データベースがマウントされていない場合、またはマウントされておらず開かれていない場合に使用できる場合があります。
あなたの例を使用して:
V$TABLESPACE
はX$KCCTS
内部メモリ構造であるのビューです。 DBA_TABLESPACES
データディクショナリテーブルのビューです SYS.TS$
Adam Muschが示した違いに加えて、dba_ビューとv $ビューの間には、これらの違いに気付いていない場合に問題になる可能性があるため、言及する価値のあるいくつかの違いがあります。
1)ほとんど(すべてではない)のv $ビューは、技術的にはまったくビューではありませんが、v_ $ビューの同義語です。シノニムに対して権限を付与/取り消すことができないため、これは重要な違いです。
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)dba_ビューに対してフラッシュバッククエリを実行できます。ただし、v $ビューに対してフラッシュバッククエリを実行すると、現在のデータが返されます(Oracleフラッシュバックテクノロジの使用に関する12.1ドキュメント)。
動的パフォーマンス(V $)ビューから過去のデータを取得することはできません。このようなビューに対するクエリは、現在のデータを返します。
* _TABLESなどの静的データディクショナリビューで過去のデータに対してクエリを実行できます。
Adam Muschが指摘したように、v $ビューはインスタンスに対して直接実行され、dba_ビューはデータディクショナリに対して実行されます。それを理解すれば、なぜこの制限が設けられているのか理解できます。それでも、私は本当に v $ビューに対するフラッシュバッククエリが静かに機能するのではなくエラーを返すことを願っています。