В чем разница между av $ view и его эквивалентом dba_?

9

Какая общая разница между v$представлением и его dba_эквивалентом? Взять, к примеру, v$tablespaceи dba_tablespaces.

Просто ученик
источник

Ответы:

13

Самый простой способ думать об этом:

  • DBA_ / USER_ / ALL_ Представления построены на словаре данных - они недоступны, если база данных не смонтирована и не открыта.

  • V$ Представления, как правило, работают с экземпляром и, следовательно, могут быть доступны, если база данных не смонтирована или не смонтирована и не открыта, в зависимости от характера представления.

Используя ваш пример:

  • V$TABLESPACEэто взгляд на X$KCCTSструктуру внутренней памяти.
  • DBA_TABLESPACES представление таблицы данных словаря SYS.TS$
Адам Муш
источник
3

Помимо отличий, которые перечислил Адам Муш, есть еще несколько отличий между представлениями 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 возвращал ошибку, а не работал бы молча, поскольку эта ошибка может оставаться незамеченной в течение довольно долгого времени

Крис Джонстон
источник