Oracle Database - MV Быстрое обновление, ссылочный вид - PullRequest
0 голосов
/ 31 октября 2019

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

1 Ответ

0 голосов
/ 01 ноября 2019

Вы, безусловно, можете иметь 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 натаблицы, используемые представлением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...