- Este tópico contém 9 respostas, 5 vozes e foi atualizado pela última vez 15 anos, 7 meses atrás por
eversonpiza.
-
AutorPosts
-
28 de agosto de 2009 às 5:25 pm #89361
eversonpiza
ParticipanteOlá 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,
Everson28 de agosto de 2009 às 5:34 pm #89362Marcio68Almeida
ParticipanteIsso é 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…28 de agosto de 2009 às 5:38 pm #89363Ishii
ParticipanteOlá,
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
28 de agosto de 2009 às 5:48 pm #89366Marcio68Almeida
ParticipanteA 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…28 de agosto de 2009 às 6:41 pm #89367eversonpiza
ParticipanteGostei 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
28 de agosto de 2009 às 7:34 pm #89369Marcio68Almeida
ParticipantePode não aparecer (mistério)…
Porém, se você fizer o teste inserindo uma informação nula verá que a validação está ativada…28 de agosto de 2009 às 8:27 pm #89370eversonpiza
ParticipantePelo 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?
28 de agosto de 2009 às 9:59 pm #89372vieri
ParticipanteSeu 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.
.
28 de agosto de 2009 às 11:54 pm #89376Rodrigo 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,
15 de setembro de 2009 às 9:47 pm #89689eversonpiza
ParticipanteOlá 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 -
AutorPosts
- Você deve fazer login para responder a este tópico.