Quero saber a maneira mais eficiente de atualizar todas as linhas em uma tabela Oracle extremamente grande para uma única coluna. Por exemplo:
update mytable set mycolumn=null;
ou:
update mytable set mycolumn=42;
Meu conhecimento pode muito bem ser obsoleto. O que faço é alterar a tabela para soltar a coluna. Em seguida, altero a tabela para adicionar a coluna com um valor padrão do novo valor que quero usar. Em seguida, altero a tabela para remover o valor padrão da coluna. Acho que isso é muito mais rápido do que apenas executar uma atualização, mas sinto que existe um método melhor.
Respostas:
Depende muito das outras atividades realizadas nessa tabela enquanto você realiza esta atualização em massa. Espero que você tenha algum tipo de ambiente de teste em que possa executar algumas amostras do que gostaria de fazer e ter uma idéia de qual é o melhor. Eu tentaria:
update table set column_name = blah
;updating the column=blah
e confirme todas as atualizações do X (talvez 10000). Você pode paralelizar esse código copiando-o e fazendo-o copiar em uma seção separada das chaves primárias.Tínhamos um problema muito semelhante com uma tabela que era muito ativamente usada no sistema OLTP e conseguimos paralelá-la 5x e executada sem impacto de bloqueio do usuário em uma tabela de linha com mais de 100 MM que confirmava a cada 10000. Você não disse como sua mesa é grande ou que tipo de aplicativo você está executando, mas esse tipo de solução pode se adequar a você.
fonte
Para um jejum
UPDATE
, verifique se você não tem nenhum gatilho que esteja disparando.Certifique-se de reativar apenas os que deseja quando terminar.
Você também pode estar executando a sobrecarga da manutenção do índice. Tente recriar seus índices separadamente. Para fazer isso, a resposta aqui pelo pappes deve ser útil: /programming/129046/disable-and-later-enable-all-table-indexes-in-oracle
Estou repetindo a resposta dos pappes aqui para referência. (Observe que este comando SPOOL faz suposições sobre sua plataforma e ambiente.)
Importar ...
fonte
remova o índice. atualize a coluna. retornar o índice de volta. mas se a coluna contiver o mesmo valor para todas as linhas, você poderá eliminar o índice.
fonte
Se você não tiver limitação de espaço, poderá criar uma nova tabela, igual à sua tabela com sua nova coluna adicionada a essa tabela e excluir a tabela antiga:
fonte
Tente várias seqüências de atualização / confirmação. Inserir / Atualizar / Excluir muitas linhas sem confirmação leva a uma carga pesada de E / S. Ele pode ser bastante otimizado, sabendo o tamanho dos blocos e os tamanhos dos registros.
Para excluir dados inteiros em uma tabela,
truncate table x
é melhor quedelete from x
. A limpeza também gera outra carga de trabalho do processo.Editar: você pode usar a
inmemory
opção, carregando a tabela na memória em formato colunar e, em seguida, faça a atualização. realmente depende dos relacionamentos e da estrutura do seu banco de dados. Veja este artigo .fonte
truncate
oudelete
seria de alguma ajuda.