Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Materialized view


Автор: KaKTyCc 26.3.2007, 13:29
Есть matview, которое необходимо обновлять например каждые 15 минут

Код

CREATE MATERIALIZED VIEW TEST.IP$LOT$OFFER2REQ 
TABLESPACE USERS1
NOCACHE
LOGGING
NOCOMPRESS
NOPARALLEL
BUILD IMMEDIATE
REFRESH COMPLETE
START WITH TO_DATE('26-мар-2007 14:30:00','dd-mon-yyyy hh24:mi:ss')
NEXT TRUNC(SYSDATE,'HH24') + (FLOOR(EXTRACT(MINUTE FROM (SYSDATE - TRUNC(SYSDATE)) DAY TO SECOND)/15)+1)*15 / 24 / 60   
WITH PRIMARY KEY
AS 
select distinct(req.id)       req_id
     , offer.id     ofr_id
     , 0            OVERFLOWED

  from ip$lots$offer    offer
     , ip$lot$request   req
     , exsu$date        d_req
     , exsu$date        d_offer
     , new$hier$cache   hc_offer
     , new$nt           nt
     , table(nt.t#id)   h1 
   , new$val      v1
   , new$val      v2
   , new$reestr    r1
   , new$reestr    r2
 where  r1.id = req.id
   and r2.id = offer.id
   and r1.pid != r2.pid
   and hc_offer.sid = offer.id 
   and hc_offer.pwr = 1
   and nt.id = req.id
   and nt.code = 'h1'
   and d_req.id         = req.id
   and d_req.pubdate    >= sysdate
   and d_offer.id       = offer.id
   and d_offer.pubdate  >= sysdate
   and hc_offer.mid   = h1.column_value
  and (    v1.id   = offer.LOT_TYPE
       and v2.id   = req.LOT_TYPE
       and v1.val  = v2.val
       )

   and (    (    req.price_actual_min <= offer.price_actual
             and req.price_actual_max >= offer.price_actual
            )
         or (    req.price_actual_min <= offer.price_internal
             and req.price_actual_max >= offer.price_internal
            )
       );


для этого matview создается regresh group 
Код

DECLARE
  SnapArray SYS.DBMS_UTILITY.UNCL_ARRAY;
BEGIN
  SnapArray(1) := 'TEST.IP$LOT$OFFER2REQ';
  SnapArray(2) := NULL;
  SYS.DBMS_REFRESH.MAKE (
    name => 'TEST.IP$LOT$OFFER2REQ'
    ,tab  => SnapArray
    ,next_date => TO_DATE('03/26/2007 14:30:00', 'MM/DD/YYYY HH24:MI:SS')
    ,interval  => 'TRUNC(SYSDATE,''HH24'') + (FLOOR(EXTRACT(MINUTE FROM (SYSDATE - TRUNC(SYSDATE)) DAY TO SECOND)/15)+1)*15 / 24 / 60   '
    ,implicit_destroy => TRUE
    ,lax => TRUE
    ,job => 0
    ,rollback_seg => NULL
    ,push_deferred_rpc => TRUE
    ,refresh_after_errors => FALSE
    ,purge_option => 1
    ,parallelism => 0
    ,heap_size => 0
  );
Commit;
END;
/


и job

Код

DECLARE
  X NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT
    ( job       => X 
     ,what      => 'dbms_refresh.refresh(''"TEST"."IP$LOT$OFFER2REQ"'');'
     ,next_date => to_date('26.03.2007 14:30:00','dd/mm/yyyy hh24:mi:ss')
     ,interval  => 'TRUNC(SYSDATE,''HH24'') + (FLOOR(EXTRACT(MINUTE FROM (SYSDATE - TRUNC(SYSDATE)) DAY TO SECOND)/15)+1)*15 / 24 / 60   '
     ,no_parse  => TRUE
    );
  SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
END;
/

commit;


Но после  job'a, matview становиться инвалидным объектом :-(
Не понимаю, что не так  smile , помогите 

Автор: KaKTyCc 26.3.2007, 14:30
если принудительно выполнить job, всё ок, сам же job в инвалид скидывает матвью....

Автор: DimW 26.3.2007, 15:28
KaKTyCc,  на сколько я помню рефресш мат. представления я делал так:

dbms_snapshot.refresh('mv_name');

таких проблем как у тебя не возникало.

p.s.  ora - 9.2.0.7  

Автор: KaKTyCc 26.3.2007, 15:36
как только не крутил...

заметил что инавалидом матвью становиться после job'а, если данные не изменились, и матвью остается таким, каким был.

Автор: KaKTyCc 26.3.2007, 15:56
оказывается, если добавить какие то данные или удалить из таблицы участвующей в запросе, матвью становится инвалидным...
как побороть? не понимаю  smile 

нужна простая вещь, обновлять матвью каждые 15 минут...

Автор: LSD 26.3.2007, 16:24
Создай простой MATERIALIZED VIEW и попробуй на нем,  JOB будет работать или нет.

Автор: KaKTyCc 26.3.2007, 16:35
Матвью обновляется, и джобом, и если при создании матвью задать интервал.
Но матвью становится инвалидным, если например а таблицу ip$lots$offer добавляю запись...
и после этого, как приходит время обновления, матвью не обновляется...
если же я скомпилю матвью после добавления строки, оно как приходит время обновляется.

Автор: LSD 26.3.2007, 17:01
1. Зачем SnapArray(2) := NULL;
2. Зачем нужно использовать и JOB и refresh group?

Автор: KaKTyCc 26.3.2007, 17:10
job создается автоматически, если при определении матвью указать интервал обновления.
в общем есть подозрение что это http://www.sql.ru/forum/actualthread.aspx?tid=218429#1897438 оракловая...

Автор: KaKTyCc 27.3.2007, 09:09
http://jornica.blogspot.com/2007/01/unbreakable-materialized-views.html ещё.
Написано что матвью автоматически скомпилиться, но у меня это не происходит...

Автор: KaKTyCc 27.3.2007, 09:45
Частично решил проблему, добавив в job помимо обновления refresh'а компиляцию матвью
Код

begin
EXECUTE IMMEDIATE 'ALTER MATERIALIZED VIEW IP$LOT$OFFER2REQ COMPILE';  
dbms_refresh.refresh('"TEST"."IP$LOT$OFFER2REQ"');
end;


В доке написано что матвью само станет валидным при рефреше, если статус у него  UNUSABLE, но у меня почему то оно становится всегда
NEEDS_COMPILE....

Автор: KaKTyCc 28.3.2007, 08:36
это конечно не дело... ddl мне не нужен в job'е:-(
не могу понять, почему матвью бьется так сильно....

Автор: KaKTyCc 28.3.2007, 09:14
A materialized view is automatically revalidated when it is referenced. In many cases, the materialized view will be successfully and transparently revalidated. However, if a column has been dropped in a table referenced by a materialized view or the owner of the materialized view did not have one of the query rewrite privileges and that privilege has now been granted to the owner, you should use the following statement to revalidate the materialized view:

ALTER MATERIALIZED VIEW mview_name COMPILE;

GRANT QUERY REWRITE TO TEST;
но от этого не легче...
что я делаю не так?   smile 

Автор: LSD 28.3.2007, 14:09
Попробуй пользоателю от имени которого работает job, выдать права явно а не через роль.

Автор: KaKTyCc 28.3.2007, 15:55
Цитата(LSD @  28.3.2007,  14:09 Найти цитируемый пост)
Попробуй пользоателю от имени которого работает job, выдать права явно а не через роль.

явно и выданы права... 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)