Pular para o conteúdo
Visualizando 6 posts - 1 até 6 (de 6 do total)
  • Autor
    Posts
  • #91825
    gsmdf
    Participante

      Prezados,

      Tenho de criar uma view materializada para integrar dados de 3 tabelas do sistema.
      Gostaria de saber se os dados dela são atualizados automaticamente a medida que cada uma das 3 tabelas originais sofrem modificação ou se tenho de incluir alguma diretiva no SQL de criação da view com esse propósito.

      Grato.

      #91827
      Marcos Braga
      Participante

        Oi gsmdf,

        É bom sabermos qual versão do banco de dados está utilizando para auxiliá-lo melhor nesse processo.

        Andei olhando a criação de VM na versão 10g e observei que tem um parâmetro chamado REFRESH_FAST_AFTER_INSERT, creio que esse parâmetro é o que busca (mas nunca utilizei, portanto é bom pesquisar antes de aplicá-lo).

        É um caminho.

        []s
        Braga

        #91828
        gsmdf
        Participante

          Dei uma pesquisada aqui e achei o parâmetro:

          REFRESH FAST ON COMMIT

          Obrigado.

          #91829
          fsitja
          Participante

            Você precisa criar um materialized view log e criar a materialized view com opção fast refresh on commit.
            Se o SQL da view tiver joins você precisa criar um view log para todas as tabelas e incluir as opções de criar view log por rowid e incluindo as colunas das chaves estrangeiras.

            http://download.oracle.com/docs/cd/E118 … s_6002.htm
            http://download.oracle.com/docs/cd/E118 … s_6003.htm

            Segue um exemplo para você verificar.


            SQL> create table t1 (col1 number primary key);

            Table created.

            SQL> create materialized view log on t1;

            Materialized view log created.

            SQL> create materialized view mv_t1
            2 build immediate
            3 refresh fast on commit
            4 as select col1 from t1;

            Materialized view created.

            SQL> select owner, table_name from all_tables where table_name = 'MLOG$_T1';

            OWNER TABLE_NAME


            CMZA MLOG$_T1

            SQL> insert into t1 values (1);

            1 row created.

            SQL> select * from mlog$_t1;

              COL1 SNAPTIME D O CHANGE_VECTOR$$
            

                 1 01/01/00 I N FE
            

            SQL> select * from mv_t1;

            no rows selected

            SQL> commit;

            Commit complete.

            SQL> select * from mv_t1;

            COL1

                 1
            

            SQL> select * from mlog$_t1;

            no rows selected

            SQL>

            #91837
            VitorLeandro
            Participante

              Outra solução além das apontadas acima, é utilizar o “refresh fast on demand” onde somente será atualizada a MV se executar a solicitação. Isso é interessante caso o seu motivo seja um relatório histórico ou coisa do tipo. Convém verificar os parâmetros QUERY_REWRITE_ENABLED = TRUE onde outras querys podem automaticamente se beneficiar da MV.

              informações adicionais:

              Para se atualizar uma MV na mão, basta rodar a PKG abaixo passando como parametro o nome da tabela e o tipo de REFRESH (opcional) (F-Fast refresh ou C-Complete Refresh):

              EXECUTE DBMS_MVIEW.REFRESH(‘MV_Sales’,’F’);

              Tome cuidados com as MV Logs, elas irão ocupar espaço em seu DB e conseqüentemente, outros recursos.
              [/b]

              #91848
              gsmdf
              Participante

                [quote=”fsitja”:34mgewmt]Você precisa criar um materialized view log e criar a materialized view com opção fast refresh on commit.
                Se o SQL da view tiver joins você precisa criar um view log para todas as tabelas e incluir as opções de criar view log por rowid e incluindo as colunas das chaves estrangeiras.

                http://download.oracle.com/docs/cd/E118 … s_6002.htm
                http://download.oracle.com/docs/cd/E118 … s_6003.htm

                Segue um exemplo para você verificar.


                SQL> create table t1 (col1 number primary key);

                Table created.

                SQL> create materialized view log on t1;

                Materialized view log created.

                SQL> create materialized view mv_t1
                2 build immediate
                3 refresh fast on commit
                4 as select col1 from t1;

                Materialized view created.

                SQL> select owner, table_name from all_tables where table_name = 'MLOG$_T1';

                OWNER TABLE_NAME


                CMZA MLOG$_T1

                SQL> insert into t1 values (1);

                1 row created.

                SQL> select * from mlog$_t1;

                  COL1 SNAPTIME D O CHANGE_VECTOR$$
                

                     1 01/01/00 I N FE
                

                SQL> select * from mv_t1;

                no rows selected

                SQL> commit;

                Commit complete.

                SQL> select * from mv_t1;

                COL1

                     1
                

                SQL> select * from mlog$_t1;

                no rows selected

                SQL>
                [/quote]

                Criei o log da view e deu certo.

                Vlw!

              Visualizando 6 posts - 1 até 6 (de 6 do total)
              • Você deve fazer login para responder a este tópico.