Eu tenho um data warehouse (oracle) em que preciso definir uma coluna com o mesmo valor para todos os 700 milhões de linhas.
Eu não tenho acesso de administrador ou acesso a um administrador, portanto, isso precisa ser realizado com sql básico e nenhuma tabela temporária é criada.
Para complicar ainda mais, se eu tentar apenas fazer uma atualização simples em que 1 = 1, ela ficará sem espaço para refazer.
O jeito que eu estou executando agora é um loop como este:
loop
update mytable set mycolumn = '1' where mycolumn is null and rownum < 50000;
commit;
end loop
mas sei que isso é provavelmente ingênuo e deve haver uma solução mais rápida e elegante.
oracle
performance
owook
fonte
fonte
Respostas:
Se você tiver espaço, poderá CTAS usando o mínimo de desfazer / refazer . Se você tiver algum índice, fazê-lo de qualquer outra maneira será muito lento e gerará log como um louco.
No caso de você ter uma única IOT sem índices secundários ou um único cluster de tabela, você pode percorrer a atualização da chave primária / de cluster em blocos sem precisar redigitalizar a tabela inteira para localizar os campos que ainda não foram atualizados.
--editar
Então, sugiro que divida a tabela em partes para processamento usando algo que você está indexando (mesmo que seja uma coluna única, você pode dividi-la em intervalos de valores). código. Você terá que conviver com uma grande quantidade de refazer e também limpará seu espaço de desfazer (portanto, nenhum flashback posteriormente)
--edit2
se você pode adicionar / renomear / soltar colunas, você pode fazer isso com muita eficiência , mas apenas no 11g
fonte
NOLOGGING
, isso invalidará os hotstandbys.nologging
é uma ferramenta para armazénscreate table foo as select * from bar where rownum<100000
)Se você usa 11g, solte a coluna e adicione-a novamente como uma coluna NOT NULL com um valor padrão. Isso é contra-intuitivo, mas o Oracle armazenará o valor padrão na definição da tabela, substituindo o valor padrão no tempo de execução.
fonte