Movendo uma tabela para um esquema diferente no Oracle

5

Como faço para mover uma tabela de um esquema para outro? É uma tabela razoavelmente grande, portanto, a consulta a seguir demoraria séculos para ser concluída e precisaria de muito espaço em disco:

CREATE TABLE newschema.mytable AS SELECT * from oldschema.mytable;

Eu tentei renomear a tabela:

ALTER TABLE oldschema.mytable RENAME TO newschema.mytable;

mas parece que a Oracle não permite isso (recebo um ORA-14047).

Quais são minhas opções? exp / imp é provavelmente mais rápido que a cópia "simples", mas ainda precisaria de muito espaço livre em disco.

    
por Henning 11.11.2009 / 12:24

4 respostas

4

Eu ficaria chocado se houvesse uma solução mais rápida do que o CREATE TABLE AS SELECT. Exportar e importar, independentemente de você estar usando a versão clássica ou a versão DataPump, exigirá que o Oracle leia a tabela inteira do disco e grave a tabela inteira em disco no novo esquema, assim como o CTAS, mas com uma etapa intermediária de gravar os dados no arquivo de despejo e lê-los no arquivo de despejo. Você pode ser criativo e tentar canalizar a saída do utilitário de exportação para o utilitário de importação e ter a exportação e a importação em execução simultaneamente para evitar potencialmente gravar todos os dados no disco, mas você está apenas trabalhando para eliminar parte do I / O que tornam a exportação e a importação inerentemente mais lentas. Além disso, geralmente é mais fácil paralelizar um CTAS do que tentar paralelizar a exportação e a importação.

O benefício de exportar e importar, por outro lado, é que você pode mover as restrições, índices e outros objetos dependentes automaticamente. Se você fizer um CTAS, terá que criar os índices e restrições separadamente depois que os dados forem preenchidos.

    
por 12.11.2009 / 18:49
1

Exporte o esquema no oldschema, mas defina rows = n para que nenhum dado seja exportado. Use o DDL para criar a nova tabela. Em seguida, use select into repetidamente para mover blocos de dados quando não afetarem muito o desempenho. Quando todos os dados forem movidos, use o DDL para criar os índices.

    
por 11.11.2009 / 15:46
1

Supondo que você esteja usando 10g ou mais, usaria Data Bombeie para sua eficiência. Aqui está uma boa visão geral concisa dos utilitários. Não há uma operação simples de renomeação para fazer o que você quer fazer - você terá que mover dados. Eu encontrei este método interessante .

    
por 11.11.2009 / 17:24
0

Aqui eles têm uma resposta para: Como mover uma tabela para outro esquema? o autor cria uma tabela particionada por intervalo e, em seguida, cria a criação do layout para nova tabela. Depois ele : alter table t1_temp troca dummy de partição com a tabela t1 incluindo índices sem validação; alter table t1_temp troca dummy de partição com a tabela kutrovsky.t1 incluindo índices sem validação;

O primeiro comando "atribui" o segmento de dados à tabela t1_temp. O segundo comando "atribui" o segmento de dados à tabela t1 no novo proprietário

Não é tão fácil quanto no SQL Server, onde você moveria pessoas. Endereço para Recursos Humanos por: ALTER SCHEMA HumanResources TRANSFER Endereço da pessoa;

    
por 26.09.2011 / 17:05