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
meguelito
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 60
Registrado em: Ter, 17 Jan 2006 1:45 pm
Localização: Santa Catarina
Att.:
Alan Juliano Metzger
Programador Oracle
Inside System Informática
Msn/E-mail: alanjuliano@yahoo.com.br

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.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

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

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).
meguelito
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 60
Registrado em: Ter, 17 Jan 2006 1:45 pm
Localização: Santa Catarina
Att.:
Alan Juliano Metzger
Programador Oracle
Inside System Informática
Msn/E-mail: alanjuliano@yahoo.com.br

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??
Yana Disconzi
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Seg, 16 Nov 2015 12:59 pm

Respondendo sua pergunta:

Selecionar tudo

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]ALIZED VIEW LOG "
COMPLETE "Trunca a tabela e faz o novo insert "
FORCE "Oracle tenta fazer um FAST Refresh se não for possível, então, COMPLETE"
]
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]

[/code]
edutavaresjiva
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qua, 06 Set 2017 10:47 am

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:

Selecionar tudo

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
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

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

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.

Selecionar tudo

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.

Selecionar tudo

select key, val, rowid from mv ;

Selecionar tudo

       KEY VAL   ROWID
---------- ----- ------------------
         1 a     AAAWgHAAEAAAAIEAAA
         2 b     AAAWgHAAEAAAAIEAAB
         3 c     AAAWgHAAEAAAAIEAAC
         4       AAAWgHAAEAAAAIEAAD

Selecionar tudo

execute DBMS_MVIEW.REFRESH( LIST => 'MV', METHOD => 'C' );
 
select key, val, rowid from mv ;

Selecionar tudo

       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.
edutavaresjiva
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qua, 06 Set 2017 10:47 am

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:

Selecionar tudo

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;
Responder
  • Informação
  • Quem está online

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