Pular para o conteúdo
  • This topic has 9 replies, 2 voices, and was last updated 9 years ago by Avatar de HudsonHudson.
Viewing 10 posts - 1 through 10 (of 10 total)
  • Author
    Posts
  • #107827
    Avatar de HudsonHudson
    Participant

      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

      #107830
      Avatar de J. WiltonJ. Wilton
      Participant

        Poderia postar a DDL da sua view materializada e versão do banco?

        #107835
        Avatar de HudsonHudson
        Participant

          DDL 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

          #107838
          Avatar de J. WiltonJ. Wilton
          Participant

            Bom 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?

            #107840
            Avatar de HudsonHudson
            Participant

              Bom 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.

              #107845
              Avatar de HudsonHudson
              Participant

                Agora 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?

                #107847
                Avatar de J. WiltonJ. Wilton
                Participant

                  acredito 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?

                  #107848
                  Avatar de HudsonHudson
                  Participant

                    Me 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

                    #107849
                    Avatar de J. WiltonJ. Wilton
                    Participant

                      pode 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;

                      #107850
                      Avatar de HudsonHudson
                      Participant

                        Executando 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.

                      Viewing 10 posts - 1 through 10 (of 10 total)
                      • You must be logged in to reply to this topic.
                      plugins premium WordPress