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

      Olá amigos,

      Tenho uma tabela mais mais de 50 milhões de linhas, e que por um problema em uma migração no passado ficou com 60 campos ‘NULL’ e deveriam ser ‘NOT NULL’.

      Já verifiquei e vi que não existem valores nulos neste campo, por isso gostaria de fazer um ‘alter table modify campo not null’ instantâneo para evitar um lock de horas, tem como?

      Obrigado,
      Everson

      #89362
      Marcio68Almeida
      Participante

        Isso é bastante simples…
        [code]ALTER TABLE “owner”.”tabela” MODIFY (“coluna” NOT NULL)[/code
        Porém…
        A tabela ficará em LOCK até o processo terminar, o que pode demorar um pouco, portanto veja a melhor hora para fazer esta modificação…

        #89363
        Ishii
        Participante

          Olá,

          Use o NOVALIDATE na alteração, com isso a coluna será alterada para not null mas não será feita nenhuma checagem imediata.


          alter table modify campo not null novalidate

          Acho que com isso não haverá o lock demorado…

          []s Ishii

          #89366
          Marcio68Almeida
          Participante

            A opção NOVALIDATE é uma ótima opção, porém, como o próprio nome diz, o processo não será validado, se, mais para frente você tentar alterar uma outra coluna desta tabela e o tal registro possuir valor NULL, a alteração não será concretizada. Como trata-se de uma tabela com milhões de linhas, esse erro pode acabar acontecendo daqui a algum tempo, e ninguém mais vai se lembrar desta possibilidade…
            Se for confirmado que não há registros com NULL, então é uma boa opção…

            #89367
            eversonpiza
            Participante

              Gostei bastante da idéia do novalidate, mas fiz um teste aqui e pareceu algo estranho, quando dou um DESC na tabela ele não diz que o campo é NOT NULL, porem quando tento inserir novos dados null dá erro.

              SQL> create table teste_erp (x number);

              Table created.

              SQL> desc teste_erp;
              Name Null? Type


              X NUMBER

              SQL> alter table teste_erp modify x not null novalidate;

              Table altered.

              SQL> desc teste_erp;
              Name Null? Type


              X NUMBER

              SQL> alter table teste_erp modify x null;

              Table altered.

              SQL> desc teste_erp;
              Name Null? Type


              X NUMBER

              SQL> alter table teste_erp modify x not null ;

              Table altered.

              SQL> desc teste_erp;
              Name Null? Type


              X NOT NULL NUMBER

              #89369
              Marcio68Almeida
              Participante

                Pode não aparecer (mistério)…
                Porém, se você fizer o teste inserindo uma informação nula verá que a validação está ativada…

                #89370
                eversonpiza
                Participante

                  Pelo oq eu vi aqui, ele só mostra ‘NOT NULL’ no DESC se a constraint tiver sido validada, enquanto não validar ele não monstra por não garantir a integridade da constraint, mas valida novos valores inseridos.

                  Mas vc pode validar a contraint pelo comando:
                  alter table modify constraint validate;

                  E o validate não faz lock na tabela, ou seja, acredito que esta seja a solução, faço um alter table … not null novalidade, que é rápido, e depois valido a constraint, que demora mas não faz lock.

                  Concordam?

                  #89372
                  vieri
                  Participante

                    Seu problema é o tempo né…

                    porque vc não da um create table as select da dita cuja e faz os teste nelas sem bloquear ninguem.

                    assim vc poderá ter uma estimativa.

                    .

                    #89376
                    Rodrigo Almeida
                    Participante

                      Ótima Ideia Vieri…. tb acho mais rápido. E o processo depois de um RENAME, e habilitar a pk e fks, devem demorar bem menos tempo.

                      Abraços,

                      #89689
                      eversonpiza
                      Participante

                        Olá pessoal,

                        Apenas para ‘concluir’ a solução, fiz da forma que tinha dito, coloquei o not null com novalidate e depois fiz a validação, funcionou perfeitamente bem, sem gerar locks no banco.

                        Att.
                        Everson

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