Dúvida Materialized View FAST, FORCE, COMPLETE

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Qui, 27 Set 2007 11:44 am

Bom dia Galera, estou aqui novamente e hoje com uma pergunta fácil acho eu.

Queria saber qual a diferença de criar uma Materialized VIew com Refresh Fast ou com Referesh Force e com Refresh Complete, pois estou tentando criar uma Refresh Fast e me diz que não posso criar com uma query mais avançada, e as documentações me dizem para colocar FORCE ou COMPLETE.
meguelito
Localização: Santa Catarina

Att.:
Alan Juliano Metzger
Programador Oracle
Inside System Informática
Msn/E-mail: alanjuliano@yahoo.com.br

Mensagemem Qui, 27 Set 2007 1:34 pm

Pois é: existe uma série de restrições pra criação de materialized views. Neste link está sendo falado exatamente sobre isso:
http://glufke.net/oracle/viewtopic.php?t=735
http://glufke.net/oracle/viewtopic.php?t=1720
(eu não sei de cor as restrições, terá que consultar a documentação).
dr_gori
Localização: Portland, OR USA

Thomas F. G

Você já respondeu a dúvida de alguém hoje?
http://glufke.net/oracle/search.php?search_id=unanswered

Mensagemem Qui, 27 Set 2007 1:46 pm

Sim as restrições eu sei que tem mas eu queria saber qual a diferença entre as três maneiras só isso, eu sei que a FAST pega somente os registros novos e a COMPLETE pega tudo toda vez e a FORCE faz o que??
meguelito
Localização: Santa Catarina

Att.:
Alan Juliano Metzger
Programador Oracle
Inside System Informática
Msn/E-mail: alanjuliano@yahoo.com.br

Mensagemem Qua, 17 Jan 2018 3:50 pm

Respondendo sua pergunta:
Código: Selecionar todos
BUILD [IMMEDIATE "A view é preenchida imediatamente"
      DEFERRED]  "A view é preenchida no proximo refresh"
REFRESH [FAST   "Insere ou exclui as linhas que foram alteradas-  precisa definir MATERI[code][code][/code][/code]ALIZED VIEW LOG "
         COMPLETE "Trunca a tabela e faz o novo insert "
       FORCE [b] "Oracle tenta fazer um FAST Refresh se não for possível, então, COMPLETE"[/b]
      ]
         ON [COMMIT "Atualização deverá ocorrer sempre que o banco de dados comete uma transação em uma das tabela principais da visualização materializada"
            DEMAND "O oracle não atualizara a exibição materializada, a menos que o usário execute a atualização via DBMS_MVIEW"
            NEVER "Não faz Atualização"
            ]
       START WITH "Expecifica uma data ou hora ou tempo para atualização automatica"
         NEXT
[[ENABLE | DISABLE] QUERY REWRITE]

Yana Disconzi

Mensagemem Sex, 02 Ago 2019 4:37 pm

A partir da dúvida do amigo sobre as diferenças entre FAST, FORCE e COMPLETE, gostaria que alguém me ajudasse.

Criei uma VM em um cliente que traz todas as vendas realizadas, com seus itens, clientes, etc...Essa VM é atualizada diariamente à 1 hora da manhã e alimenta os diversos Dashboards de análises comerciais.

Minha dúvida sempre foi se com o passar dos anos esse processamento na madrugada de cada dia chegaria a consumir muito recurso do banco de dados (Oracle Database 12c Standard Edition Release 12.2.0.1.0) ao ponto de "derrubar" o sistema.

Configurei a VM para que realizasse o REFRESH COMPLETE. Hoje me veio uma dúvida em saber quanto tempo, esses 7 meses de informações, está demorando para processar por completo. Entendo que o COMPLETE é reprocessar TUDO todo dia. Mas ao abrir o TOAD e ver as informações da VM, verifiquei que o LAST REFRESH estava 02/08/2019 01:00:18. Se a atualização inicia à 1 hora, espantei em ver que o processamento durou 18 segundos. Saí procurando e vi esse tópico e aproveitando, gostaria de saber se o REFRESH COMPLETE apenas faz o complemento das informações novas na base que já está lá ou se realmente processa tudo!?

Parâmetros da VM:

Código: Selecionar todos
NOCACHE
LOGGING
NOCOMPRESS
NOPARALLEL
BUILD IMMEDIATE
REFRESH COMPLETE
START WITH TO_DATE('03-ago-2019 01:00:00','dd-mon-yyyy hh24:mi:ss')
NEXT (TRUNC (SYSDATE+1) + 1/24 )
WITH PRIMARY KEY
edutavaresjiva

Mensagemem Sex, 02 Ago 2019 8:54 pm

Aqui tem um link bem interessante sobre esse assunto, tempo de geração, refresh complete, etc:
https://technology.amis.nl/2014/08/15/m ... -recreate/
Ele sugere que é mais rápido dropar e recriar a MV, do que fazer REFRESH COMPLETE... Essa é opinião dele, eu não parei pra pensar se isso realmente vale a pena.

E neste link, tem um exemplo que mostra que o REFRESH COMPLETE realmente muda os ROWIDs das linhas:
http://www.sqlsnippets.com/en/topic-12876.html

Materialized Views
REFRESH COMPLETE
There are various ways to refresh the data in a materialized view, the simplest way being a complete refresh. When a complete refresh occurs the materialized view's defining query is executed and the entire result set replaces the data currently residing in the materialized view. The REFRESH COMPLETE clause tells Oracle to perform complete refreshes by default when a materialized view is refreshed.

Código: Selecionar todos
create materialized view mv
  REFRESH COMPLETE
  as select * from t
;


Let's see a complete refresh in action now. We will use the DBMS_MVIEW.REFRESH procedure to initiate it. The "list" parameter accepts a list of materialized views to refresh (in our case we only have one) and the "method" parameter accepts a "C", for Complete refresh.

Código: Selecionar todos
select key, val, rowid from mv ;


Código: Selecionar todos
       KEY VAL   ROWID
---------- ----- ------------------
         1 a     AAAWgHAAEAAAAIEAAA
         2 b     AAAWgHAAEAAAAIEAAB
         3 c     AAAWgHAAEAAAAIEAAC
         4       AAAWgHAAEAAAAIEAAD


Código: Selecionar todos
execute DBMS_MVIEW.REFRESH( LIST => 'MV', METHOD => 'C' );

select key, val, rowid from mv ;


Código: Selecionar todos
       KEY VAL   ROWID
---------- ----- ------------------
         1 a     AAAWgHAAEAAAAIEAAE
         2 b     AAAWgHAAEAAAAIEAAF
         3 c     AAAWgHAAEAAAAIEAAG
         4       AAAWgHAAEAAAAIEAAH


Note how the rowids in the second query differ from those of the first, even though the data in table T was unchanged throughout. This is because complete refreshes create a whole new set of data, even when the new result set is identical to the old one.

If a materialized view contains many rows and the base table's rows change infrequently refreshing the materialized view completely can be an expensive operation. In such cases it would be better to process only the changed rows. We will explore this type of refresh next.
dr_gori
Localização: Portland, OR USA

Thomas F. G

Você já respondeu a dúvida de alguém hoje?
http://glufke.net/oracle/search.php?search_id=unanswered

Mensagemem Sáb, 03 Ago 2019 2:14 pm

Esses links me ajudaram muito. Obrigado!

Entendi a sistemática do REFRESH COMPLETE e FAST.

Ajustei as VM para FAST e criei as VM Log para armazenar temporariamente as informações que foram alteradas. Agora só os registros novos, editados ou excluídos serão incrementados na VM.

VM Log:
Código: Selecionar todos
CREATE MATERIALIZED VIEW LOG ON BASEPRD.TABELA
TABLESPACE BASEPRD
PCTUSED    0
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
NOCACHE
LOGGING
NOPARALLEL
WITH ROWID
EXCLUDING NEW VALUES;
edutavaresjiva


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


      Voltar para SQL

      Quem está online

      Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes