База данных Oracle — быстрое обновление MV, представление ссылок

У меня есть несколько вопросов о создании материализованных представлений с быстрым обновлением. Проблема в том, что мне нужно иметь функцию подсчета запросов (*), которая недопустима для быстрого обновления. Я где-то читал, что создаю "вспомогательный" вид, который будет выполнять count(). Я хочу сослаться на это представление из моего материализованного представления. Когда дело доходит до обновления, все работает отлично, но при попытке быстрого выполнения появляется ошибка ORA 12004. Я знаю, что мне нужны журналы материализованного представления из таблиц, на которые я ссылаюсь, но как насчет представлений? Как их создать? Также незаконно использовать count() в ссылочном представлении? как сделать столбец ROWID для этого представления? Если использовать count() незаконно, есть ли другой способ, несмотря на создание таблицы, чтобы сделать это?


person Orzelke    schedule 31.10.2019    source источник


Ответы (1)


Вы наверняка можете иметь count в материализованном представлении fast refresh:

create table t (
  c1 int primary key,
  c2 int
);

insert into t 
  select level, mod ( level, 3 )  
  from   dual
  connect by level <= 10;

commit;

create materialized view log on t
  with rowid, primary key ( c2 )
  including new values;

create materialized view mv
refresh fast on commit 
as 
  select c2, count (*)
  from   t
  group  by c2;

select * from mv;

C2     COUNT(*)   
    1           4 
    2           3 
    0           3 

insert into t 
  select -level, mod ( level, 3 )  
  from   dual
  connect by level <= 10;

commit;

select * from mv;

C2     COUNT(*)   
    1           8 
    2           6 
    0           6 

Если вы не можете быстро обновлять материализованное представление и не знаете, почему, посмотрите dbms_mview.explain_mview. Это дает разбивку возможных обновлений и их возможности для MV.

Для тех, которые невозможны, есть краткое объяснение, почему:

create table mv_capabilities_table (
  statement_id      varchar(30) ,
  mvowner           varchar(30) ,
  mvname            varchar(30) ,
  capability_name   varchar(30) ,
  possible          character(1) ,
  related_text      varchar(2000) ,
  related_num       number ,
  msgno             integer ,
  msgtxt            varchar(2000) ,
  seq               number
) ;

exec dbms_mview.explain_mview('mv');
select capability_name, possible, msgtxt from MV_CAPABILITIES_TABLE
where  capability_name like 'REFRESH%';

CAPABILITY_NAME                  POSSIBLE    MSGTXT                                                                     
REFRESH_COMPLETE                 Y           <null>                                                                      
REFRESH_FAST                     Y           <null>                                                                      
REFRESH_FAST_AFTER_INSERT        Y           <null>                                                                      
REFRESH_FAST_AFTER_ONETAB_DML    Y           <null>                                                                      
REFRESH_FAST_AFTER_ANY_DML       Y           <null>                                                                      
REFRESH_FAST_PCT                 N           PCT is not possible on any of the detail tables in the materialized view    

Если вы используете представление в своем материализованном представлении, вам необходимо создать журналы MV в таблицах, которые использует представление.

person Chris Saxon    schedule 01.11.2019
comment
Я создал эту таблицу и получил ответ: причина, по которой эта возможность отключена, не проанализирована. - person Orzelke; 02.11.2019
comment
Ответ на что? - person Chris Saxon; 04.11.2019