Bem, antes de comentar as opções, REALMENTE não há como não dizer que esse é um caso CLÁSSICO aonde o Particionamento iria propiciar performance TOP (evtando tanto o delete dos dados velhos quanto até, talvez, o insert, fazendo exchange dos novos dados), facilidade administrativa ALTÍSSIMA (vc não ia ter que programar NADA, custo e risco zero), de repente não sei se isso, comparado com o RISCO, com a DIFICULDADE de manutenção, e com o custo de homens-hora que vc vai ter desenvolvendo uma solução não justificaria, ou quase, o valor do Enterprise Edition.... Isso sem contar que também pra replicação e captura e dados o Enterprise tem *** várias *** opções prontinhas e nativas, portanto normalmente com performance e segurança MUITO muito maiores do que qquer coisa que nós , sapos de fora do kernel do banco, possamos ter, iiso TEM que ser considerado também na equaão do custo X benefício...
Bom, Realmente tendo que assumir o risco e os custos a desembolsar mantendo o Standard, eu diria o seguinte : 1. a maneira PRINCIPAL, quase que diria a única, de ter INSERTs em top-performance é vc fazer INSERTs com um ÙNICO SQL (esqueça cursores PL/SQL, esqueça LOOPs e processamento linha-a-linha), ** E ** juntar os dados a inserir num único select, a rotina TEM QUE SER : insert /*+ append */ into tabeladestino (select from tabelaquecontémosdados); e se pudessem ser inserido os 3 milhões que vc fala de uma vez EXCELENTE, sopa no mel.... Se não der, pois os dados chegam aos poucos, junte uma porão de registros e mais tarde faça o insert /*+ append */ .... No banco 10g (e 9i, inclusive ), esse "lugar" pode ser até um arquivo-texto que seria lido via external table. Opcionalmente, se permitido, poderia se usar Paralelismo. 2. há exigências e recomendações para 1), tais como tabelas em modo nologging, índices desabilitados durante a carga,triggers DESABILITADAS também, e outras mais, SE isso inviabilizar no seu caso a opção 1) aí a próxima melhor opção seria continuar ajuntando os dados a inserir e quando juntou uma boa porção ter um cursor fazendo leitura em bulk e inserindo em array com forall. ==> O que NÃO funciona eficientemente, e não tem muito como otimizar, é a PIOR das piores, que deve ser evitada sempre que possível, é vc fazer um INSERT com uma linha de cada vez, repetidas e inúmeras vezes pra no final ter os tais 3 milhões, isso não tem mágico que faça ficar nem perto de comparável às outras opções... 3. o delete : se a query que localiza os regs velhos a deletar já está o máximo possível otimizada, sozinha ela roda muito bem, provavelmente fazendo um index scan num índice que só contenha a data de controle, mas ainda assim o tempo do delete não está atendendo,provavelmente o que deve estar "pegando" é o undo gerado e/ou a manutenção dos índices, ambos são INESCAPÁVEIS quando há um delete, não existe NOLOGGING para deletes, aí uma opção poderia ser vc adotar o delete lógico, ie : vc tem uma FLAG indicando que o registro não pode ser usado, os SQLs programas TODOS foram alterados para respeitar isso, e a rotina de remoção ao invés de delete físico faz só o update dessa flag (em bulk, paralelo, etc) - DEPOIS, fora do horário de pico, talvez num fim-de-semana ou feriado, aí sim vc se livra desses registros flagados, se compensar em termos de processamento/esforço vc simplesmente manda um INSERT /*+ APEND */ INTO novatabela (select from tabela where NOT registros estão flagados, e depois dropa a tabela atual e renomeia novatabela para tabelaatual, tipo assim- se não puder, ou no compensar, aí sim vc deleta esses caras fisicamente mesmo na tua janela de manutenção... 4) trigger de replicação : vc não diz, mas será que o tal banco aonde deve ser replicadaos os dados é Oracle ? SE for, vc deveria pesquisar outras opções, como basic replication (single-master), Streams, Views Materializadas, se me lembro bem em algumas versões de banco Standard algumas dessas opções já são permitidas....Já se não for banco Oracle, PESQUISE a possibilidade de "inverter" a mão de direção, ie, ao invés do banco Oacle manfar pro banco estrangeiro os dados, o banco Oracle disparar um job lá no banco estrangeiro que de lá busca as infos no Oracle, OU ainda vc ter no Oracle uma tabela ou view materializada aonde ficam as alteraões e o banco estrangeiro tem um job que a cada x minutos consulta essa tab de alterações... O problema de trigger é que ele necessariamente, para poder capturar os dados, tem que ser um trigger de row level, aí TOCA a disparar trigger para cada linha de cada DML, urgh... SE não tiver outro jeito, as outras opções REALMENTE tão fora por qquer motivo, ao menos sugiro que vc tenha uma tabela temporária de trabalho, aonde a trigger insira cada registro que sofreu dml e deve ser enviado pro banco-remoto, depois da transação o Oracle manda esses dados em bulk ou o banco estrangeiro vem buscar. []s Chiappa --- Em oracle_br@yahoogrupos.com.br, "Willian Frasson" <[EMAIL PROTECTED]> escreveu > > Boa tarde pessoal como estão? > Gostaria de saber se algum de vocês tem um ambiente por ex onde temos uma tabela de 200 milhões de registros, com um volume diário de 3 milhões de INSERTS, onde os dados mais antigos devem ser apagados, e lembrando que esta tabela também tem uma trigger de replicação para outra tabela com 70 milhões de registros, vamos raciocionar qual seria a melhor forma para que o banco trabalhe com um Load baixo, sendo que a tabela só recebe Inserts e poucos selects. > Versão: Oracle 10.2.0.3 Standart (portanto sem particionamento). > > > [As partes desta mensagem que não continham texto foram removidas] >