- This topic has 9 replies, 2 voices, and was last updated 9 years ago by Hudson.
-
AuthorPosts
-
26 de outubro de 2015 at 10:02 pm #107827HudsonParticipant
Boa tarde pessoal,
Gostaria de uma ajuda referente a views materializadas, o que pode deixar ela descompilada além de alterar a tabela referenciada? tenho algumas views criadas no banco, porém elas ficam descompilando a todo momento e não é feito nenhum alter table nas tabelas referenciadas, tem algo que eu posso verificar ou monitorar?
Desde já agradeço
27 de outubro de 2015 at 4:33 pm #107830J. WiltonParticipantPoderia postar a DDL da sua view materializada e versão do banco?
27 de outubro de 2015 at 5:40 pm #107835HudsonParticipantDDL da view
CREATE MATERIALIZED VIEW LAST_SSH
REFRESH FORCE ON DEMAND
START WITH TO_DATE(’27-10-2015 11:36:23′, ‘DD-MM-YYYY HH24:MI:SS’) NEXT SYSDATE + 1/1152
AS
SELECT S.LAST_SSH, S.DT_MONITORAMENTO, S.SEQ_CLIENTE, S.IP_MAQUINA
FROM LAST_SSH S,
(SELECT MAX(SEQ_LAST_SSH) SEQ_LAST_SSH,
S.SEQ_CLIENTE,
S.IP_MAQUINA
FROM LAST_SSH S
GROUP BY S.SEQ_CLIENTE, S.IP_MAQUINA) tab_max
WHERE S.SEQ_CLIENTE = tab_max.SEQ_CLIENTE
AND S.IP_MAQUINA = tab_max.IP_MAQUINA
AND S.SEQ_LAST_SSH = tab_max.SEQ_LAST_SSH;Versão do banco 11.2.0.4 SE
28 de outubro de 2015 at 2:57 pm #107838J. WiltonParticipantBom dia!
Com base no relato deste post: http://ermanarslan.blogspot.com.br/2013/03/invalid-materialized-view-due-to-dml-on.html
fiz alguns testes e acredito que por sua Materialized View(MV) ser on demand.. quando sofre DML nas tabelas bases ela se torna inválida e precisa de refresh (ou recompile).
Nos meus testes sempre foi possível consultar a MV apenas os dados que estavam desatualizados em relação ao tempo que coloquei na clausula NEXT , porem ao ser atualizada a mesma retorna ao estado VALID.no seu caso ao consultar a MV quando no estado NEED_COMPILE retorna erro?
simule no mesmo ambiente utilizando uma tabela de teste que você controle o acesso e commit para verificar se o comportamento é mesmo… na teoria ela deve ficar como need compile ate o proximo NEXT quando sofre refresh. só que no seu caso que parece ser uma MV para controle de acesso talvez o fluxo de commits nunca permita que ela fique no estado VALID…. utilizar ON COMMIT no lugar de ON DEMAND é uma opção?28 de outubro de 2015 at 4:31 pm #107840HudsonParticipantBom dia dbnoob,
No meu caso ao consultar a MV no estado NEED_COMPILE não retorna erro, apenas retorna os dados desatualizados também, estou fazendo a alteração para ON COMMIT e realizando os teste.
28 de outubro de 2015 at 7:53 pm #107845HudsonParticipantAgora encontrei outro problemas, alterar para ON COMMIT deve resolver o problema, porém fiz o seguinte, criei a MV log, “CREATE MATERIALIZED VIEW LOG ON LAST_SSH with ROWID;”, porém quando vou criar a MV “CREATE MATERIALIZED VIEW LAST_SSH
REFRESH ON COMMIT
START WITH TO_DATE(’27-10-2015 11:36:23′, ‘DD-MM-YYYY HH24:MI:SS’) NEXT SYSDATE + 1/1152
AS
SELECT S.LAST_SSH, S.DT_MONITORAMENTO, S.SEQ_CLIENTE, S.IP_MAQUINA
FROM LAST_SSH S,
(SELECT MAX(SEQ_LAST_SSH) SEQ_LAST_SSH,
S.SEQ_CLIENTE,
S.IP_MAQUINA
FROM LAST_SSH S
GROUP BY S.SEQ_CLIENTE, S.IP_MAQUINA) tab_max
WHERE S.SEQ_CLIENTE = tab_max.SEQ_CLIENTE
AND S.IP_MAQUINA = tab_max.IP_MAQUINA
AND S.SEQ_LAST_SSH = tab_max.SEQ_LAST_SSH;”Não funciona, “ora-12051 on commit attribute is incompatible with other options” até onde entendi o problema é o sub select da mview que não posso usar com “ON COMMIT” não sei se estou errado, tem como contornar essa situação?
28 de outubro de 2015 at 8:02 pm #107847J. WiltonParticipantacredito que você esteja certo sobre o sub select, mas tente uma nova abordagem… se compreendi seu select você quer mostrar o ultimo acesso de cada combinação cliente/ip…
materialize esse sub select… e utilize essa informação em uma view normal… teoricamente a cada commit sua informação (cliente/ip) sera atualizada.. e sua view normal apenas fara o lookup das outras informações… poderia verificar se te atende?28 de outubro de 2015 at 9:50 pm #107848HudsonParticipantMe parece que o “REFRESH FAST ON COMMIT” também não aceita view, ou fiz algo errado.
Criei a view com o sub select
create view TAB_MAX as
SELECT MAX(SEQ_LAST_SSH) SEQ_LAST_SSH,
S.SEQ_CLIENTE,
S.IP_MAQUINA
FROM LAST_SSH S
GROUP BY S.SEQ_CLIENTE, S.IP_MAQUINA;Tentando criar a mv
CREATE MATERIALIZED VIEW LAST_SSH2
REFRESH FAST ON COMMIT
AS
SELECT S.LAST_SSH, S.DT_MONITORAMENTO, S.SEQ_CLIENTE, S.IP_MAQUINA
FROM LAST_SSH S, TAB_MAX T
WHERE S.SEQ_CLIENTE = T.SEQ_CLIENTE
AND S.IP_MAQUINA = T.IP_MAQUINA
AND S.SEQ_LAST_SSH = T.SEQ_LAST_SSH;ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view
28 de outubro de 2015 at 11:37 pm #107849J. WiltonParticipantpode ser a materialized view log
tente assim:CREATE MATERIALIZED VIEW LOG ON LAST_SSH WITH ROWID( SEQ_CLIENTE, IP_MAQUINA, SEQ_LAST_SSH) INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW MV_LAST_SSH
PARALLEL
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT SEQ_CLIENTE, IP_MAQUINA, MAX(SEQ_LAST_SSH) SEQ_LAST_SSH
FROM LAST_SSH
GROUP BY SEQ_CLIENTE, IP_MAQUINA;CREATE VIEW VW_LAST_SSH AS
SELECT S.LAST_SSH, S.DT_MONITORAMENTO, S.SEQ_CLIENTE, S.IP_MAQUINA
FROM LAST_SSH S, MV_LAST_SSH T
WHERE S.SEQ_CLIENTE = T.SEQ_CLIENTE
AND S.IP_MAQUINA = T.IP_MAQUINA
AND S.SEQ_LAST_SSH = T.SEQ_LAST_SSH;29 de outubro de 2015 at 1:58 am #107850HudsonParticipantExecutando da forma que me passou não teve mais nenhum problema, J.Wilton, muito obrigado mesmo, está atualizando e não fica inválido, tenho mais algumas com o mesmo problema, mas vou rescrever como fez.
-
AuthorPosts
- You must be logged in to reply to this topic.