Какая общая разница между v$
представлением и его dba_
эквивалентом? Взять, к примеру, v$tablespace
и dba_tablespaces
.
Самый простой способ думать об этом:
DBA_ / USER_ / ALL_
Представления построены на словаре данных - они недоступны, если база данных не смонтирована и не открыта.
V$
Представления, как правило, работают с экземпляром и, следовательно, могут быть доступны, если база данных не смонтирована или не смонтирована и не открыта, в зависимости от характера представления.
Используя ваш пример:
V$TABLESPACE
это взгляд на X$KCCTS
структуру внутренней памяти. DBA_TABLESPACES
представление таблицы данных словаря SYS.TS$
Помимо отличий, которые перечислил Адам Муш, есть еще несколько отличий между представлениями 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 $ views возвращает текущие данные (12.1 документа по использованию технологии Oracle Flashback) :
Вы не можете извлечь прошлые данные из представления динамической производительности (V $). Запрос в таком представлении возвращает текущие данные.
Вы можете выполнять запросы к прошлым данным в представлениях словаря статических данных, таких как * _TABLES.
Как отметил Адам Муш, представления v $ работают непосредственно с экземпляром, тогда как представления dba_ работают со словарем данных. Как только вы понимаете это, становится понятным, почему это ограничение имеет место. Тем не менее, я действительно хотел бы, чтобы ретроспективный запрос к v $ views возвращал ошибку, а не работал бы молча, поскольку эта ошибка может оставаться незамеченной в течение довольно долгого времени