Pergunta

Eu tenho uma tabela com ~ 30.000.000 linhas que eu preciso iterar, manipular os dados para cada linha individualmente e salve os dados da linha para arquivar em uma unidade local.

Qual é a maneira mais eficiente de percorrer todas as linhas da tabela usando o SQL para Oracle? Estou pesquisando no Google, mas não vejo uma maneira direta de fazer isso. Por favor ajude. Lembre -se de que não conheço o número exato de linhas, apenas uma estimativa.

Editar para esclarecimento:

Estamos usando o Oracle 10G, acredito. Os dados da linha contêm dados do blob (arquivos de texto com zíper e arquivos XML) que serão lidos na memória e carregados em um objeto personalizado, onde serão atualizados/convertidos usando as classes de acesso .NET DOM, regoziadas e armazenadas em uma unidade local .

Não tenho muita experiência em banco de dados - planejei usar instruções SQL diretas com o ADO.NET + ORACLECOMANDS. Sem restrições de desempenho realmente. Isto é para uso interno. Eu só quero fazer da melhor maneira possível.

Foi útil?

Solução

Você precisa ler 30 milhões de linhas de um banco de dados Oracle e escrever arquivos de 30m a partir dos blobs (um arquivo XML/texto zippado em uma coluna BLOB por linha?) Em cada linha para o sistema de arquivos no computador local?

A solução óbvia está aberta um Ado.net DataReader SELECT * FROM tbl WHERE <range> Então você pode fazer lotes. Leia a bolha do leitor na sua API, faça suas coisas e escreva o arquivo. Eu provavelmente tentaria escrever o programa para que ele possa funcionar de muitos computadores, cada um fazendo suas próprias faixas - seu gargalo provavelmente será a descompactação, a manipulação e o zombamento, já que muitos consumidores provavelmente podem transmitir dados dessa tabela a partir da o servidor sem efeito perceptível no desempenho do servidor.

Duvido que você possa fazer isso com operações baseadas em conjuntos internas no banco de dados Oracle, e eu também estaria pensando no sistema de arquivos e como você vai organizar tantos arquivos (e se você tem espaço - lembre -se de O tamanho absorvido por um arquivo em um sistema de arquivos é sempre um múltiplo do tamanho do bloco do sistema de arquivos).

Outras dicas

Minha solução inicial foi fazer algo assim, pois tenho acesso a um número de identificação (pseudocode):

            int num_rows = 100;
            int base = 0;
            int ceiling = num_rows;

            select * from MY_TABLE where id >= base and id < ceiling;
            iterate through retrieved rows, do work,
            base = ceiling; 
            ceiling += num_rows;
            select * from MY_TABLE where id >= base and id < ceiling;
            iterate through retrieved rows, do work,
            ...etc.

Mas sinto que essa pode não ser a maneira mais eficiente ou melhor de fazê -lo ...

Você pode tentar usar consultas Rownum para pegar pedaços até pegar um pedaço que não existe.

Este é um bom artigo sobre as consultas Rownum:http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

Se você não tiver vontade de ler, pule diretamente para a seção "Paginação com Rownum" no final para um exemplo de consulta.

É sempre preferível usar operações baseadas em conjunto ao trabalhar com um grande número de linhas.

Você então desfrutaria de um benefício de desempenho. Após o processamento dos dados, você poderá despejar os dados da tabela em um arquivo de uma só vez.

A viabilidade disso depende do processamento que você precisa executar nas linhas, embora seja possível na maioria dos casos evitar o uso de um loop. Existe algum requisito específico que impeça você de processar todas as linhas de uma só vez?

Se a iteração através das linhas for inevitável, o uso de ligação em massa pode ser benéfico: para as operações em massa ou a coleta em massa para consultas "selecionadas em".

Parece que você precisa de todo o conjunto de dados antes da Você pode fazer qualquer manipulação de dados, pois é um blob>. Eu apenas usaria um dataAdapter.fill e, em seguida, entregava o conjunto de dados ao objeto personalizado para iterar, fazer sua manipulação e depois gravará para disco o objeto final e depois o zip.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top