Pular para o conteúdo
  • Este tópico contém 11 respostas, 6 vozes e foi atualizado pela última vez 16 anos, 7 meses atrás por eversonpiza.
Visualizando 12 posts - 1 até 12 (de 12 do total)
  • Autor
    Posts
  • #88019
    eversonpiza
    Participante

      Olá amigos,

      Tenho uma tabela com mais de 80 milhões de linhas, e tem algumas colunas com valores nulos que não deveriam, e precisar arrumar isso.
      Só que antes de dar o ‘alter table’ eu preciso fazer um update colocando um valor default nesta colunas, porém estou com medo de estourar o segmento de undo, por isso eu queria saber se existe alguma forma de fazer esse update sem usar undo.

      Alguém tem alguma idéia?

      Atn,
      Everson

      #88022
      C-S-R
      Participante

        Everton se nao me engano vc pode alterar o UNDO retention para 0.

        Assim nao sera gravado UNDO na hora de fazer os alters depois vc volta para como tava.

        Lembro de ter tido o mesmo problema que vc aqui na empresa.
        Nao lembro de ter achado nada em nao usar o UNDO na hora do alter, quem sabe outros com mais conhecimentos saibam.

        Abraços
        Cesar

        #88023
        eversonpiza
        Participante

          Olá Cesar,

          O problema é que não posso desabilitar o undo em todo o banco, como é uma operação que deve demorar horas, não terei como fazer parada no banco, teria que ser em paralelo com a produção.

          Att.
          Everson

          #88024
          eversonpiza
          Participante

            Tentei colocar a tabela em NOLOGGING mas não adiantou, fez undo do mesmo jeito…
            🙁

            #88025
            Ishii
            Participante

              Olá,

              Verifique o Parâmetro UNDO_MANAGEMENT se ele não estiver em AUTO (o que acho meio difícil) você poderia usar o SET TRANSACTION apontando para um Segmento de Rollback específico para esse seu update e depois dropando ele em seguida.


              COMMIT;
              SET TRANSACTION USE ROLLBACK SEGMENT ;
              UPDATE TABELA
              SET COLUNA = VALOR
              WHERE ...;
              COMMIT;

              Com isso fica boa a performance. Ou ainda montar um bloco PL para que num determinado valor seja feito um COMMIT.

              Alternativas não faltam…

              []s Ishii

              #88026
              David Siqueira
              Participante

                Opa!!
                Se eu não me engano se a tablespace onde a tabela estiver for criada com a opção LOGGING mesmo que você tire do objeto ele acaba por respeitar as definições da Tablespaces.

                Se não me engano é isso.

                Abcs

                #88027
                eversonpiza
                Participante

                  Ishii,

                  O UNDO_MANAGEMENT esta auto.
                  Minha alternativa seria fazer via PL/SQL mesmo, mas ai a performance piora um pouco, correto?

                  David,

                  Acho que vc tem razão, ele ignora mesmo, oq acho uma falha, pois se é para sempre seguir a definição da TS, pq posso alterar este parâmetro na tabela?

                  Att.
                  Everson

                  #88030
                  Rodrigo Almeida
                  Participante

                    Everson,

                    Você pode colocar a tabela para não gerar as entradas no REDO LOGS, exemplo:


                    SQL> alter table nologging;

                    Outro ponto para aumentar a performance:

                    1) Desabilite os índices.
                    2) Veja o LOG_BUFFER e DATA_BUFFER_CACHE se estão adequados ao total da SGA ou memória disponível do servidor.

                    Abraços,

                    Rodrigo Almeida

                    #88031
                    Ishii
                    Participante

                      Olá,

                      Além das recomendações do Alphamek, sugiro ainda ver se tem triggers e se possível desabilitar as mesmas.

                      A performance fica um pouco prejudicada, já que o acesso a disco será mais intenso e acho que pode valer a pena, uma vez que estando desabilitado o REDO isso pode ser interessante.

                      []s Ishii

                      #88034
                      David Siqueira
                      Participante

                        Everson, dê uma lida nisto :

                        [i]Disabling Logging (NOLOGGING)

                        Logging can be disabled at the table level or the tablespace level. If it is done at the tablespace level then every newly created index or table in this tablespace will be in NOLOGGING mode you can have logging tables inside a NOLOGGING tablespace). A table or an index can be created with NOLOGGING mode or it can be altered using ALTER TABLE/INDEX NOLOGGING. It is important to note that just because an index or a table was created with NOLOGGING does not mean that redo generation has been stopped for this table or index. NOLOGGING is active in the following situations and while running one of the following commands but not after that. This is not a full list:[/i]

                        Retirei isso de um dos links que tenho aqui :

                        http://vnull.pcnet.com.pl/blog/?page_id=107

                        Pode ser que lhe traga alguma luz, veja se lhe ajuda e post aqui para nós.

                        Abraço

                        #88083
                        jspaulonci
                        Participante

                          Pessoal a alternativa do Ishi é muito boa de usar um bloco pl-sql com intervalo de comitações, ou o segmento de rollback somente para essa transação, agora uma coisa é fato.

                          O Oracle não irá deixar de usar segmento de UNDO ou ROLLBACK, pelo fato da tabela e dos indices estarem em NOLOGGING, pois ele precisa garantir a consistência do dado.

                          Abraços

                          #88090
                          eversonpiza
                          Participante

                            Eu acabei optando pelo bloco pl/sql mesmo, com commit a cada 1000 registros.

                            David,
                            Não consegui abrir o link que vc mandou, não sei pq é um site bloqueado aqui na empresa, mas vou olhar depois em casa.

                            Obrigado,
                            Everson

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