Vou ter um banco de dados do SQL Server 2012 e uma tabela com 3 milhões de linhas e talvez 50 colunas. Qual será a maneira mais rápida de um processo .net de plano de fundo autônomo (talvez emita algum comando SQL ou Powershell) para exportá-lo para um arquivo de texto, uma linha para cada linha de dados? O processo .net deve saber quando a exportação foi concluída ou se houve algum erro. O tipo de dados será todo int
ou nvarchar
.
Estou assumindo que um código C # puro usando ado.net para executar um select *
comando e fazendo um loop sobre o datareader e gravando em um arquivo para cada registro será lento e não há como paralelizar isso.
Idealmente, a exportação será para uma pasta de rede compartilhada remota e não para uma pasta local na máquina do SQL Server. O SQL Server será um cluster de alta disponibilidade. O SSIS é mais adequado para isso, sem necessidade de transformação de dados?
O processo .Net seria executado na Máquina A, SQL Server na Máquina B e o destino final do arquivo é um compartilhamento de rede. Uma opção é o SQL Server grava o arquivo diretamente no compartilhamento de rede. A outra opção é o SQL Server grava na máquina A e, quando o arquivo é gravado, o processo .net o copia para o compartilhamento de rede. Não tenho SLA formal, mas espero 30 minutos - 1 hora para a gravação do arquivo.
fonte
"Ideally the export will be to a remote shared network folder and not a local folder on the SQL Server machine."
- de onde o aplicativo .NET será executado? Na pior das hipóteses, isso pode significar que os dados precisam passar por dois saltos de rede, o que provavelmente será o maior gargalo. Além disso, o número de linhas é um tanto irrelevante - qual é o tamanho total aproximado dos dados? Você tem um SLA de desempenho que precisa cumprir para esse processo?Respostas:
Fazer um loop em todos esses artigos é uma opção se você quiser envelhecer assistindo a sua execução.
Algumas opções diferentes que você deve tentar são:
E você pode tentar todas essas opções enquanto faz o loop em outra sessão, apenas por diversão :-).
fonte
Eu simplesmente usaria o Assistente para Importação e Exportação. No final, você tem a opção de salvar a tarefa, que pode ser agendada com o SQL Server Agent. Adicione-se como operador e configure o DB Mail no servidor, e ele poderá enviar um e-mail quando o trabalho for concluído ou falhar.
Sério, por que reinventar a roda?
http://msdn.microsoft.com/en-us/library/ms140052.aspx
fonte
Outros afirmaram que o bcp deve ser o caminho mais rápido, mas não vejo nenhuma vantagem sobre uma solução CLR. Nas inserções nas tabelas do banco de dados, as várias implementações de cópia em massa sempre vencerão. Isso se deve principalmente à maneira como eles minimizam o log e permitem gravações multithread. Você não tem essas restrições ao gravar em um arquivo simples.
No meu trabalho, usamos um CLR para despejar a saída da consulta em um arquivo. Também incorporamos o Ionic.Zip.dll para que o arquivo possa ser compactado automaticamente após a criação.
Aqui está um exemplo que o op afirma ser duas vezes mais rápido que o bcp em blobs: /programming/10325338/fastest-way-to-export-blobs-from-table-into-individual-files
fonte
Você pode criar um pacote simples do SSIS:
Aqui está um alto nível de como:
Qualquer noob deve ser capaz de descobrir isso. Uma pessoa anti-GUI não gostaria desta solução; portanto, salve os comentários a esse respeito, é apenas uma alternativa para indivíduos menos experientes em tecnologia que lutam usando o BCP ...
Você tem um pouco mais de flexibilidade na formatação do arquivo de dados. Você pode fazer isso no BCP e tudo mais, mas isso tira a complexidade. Mas há uma pequena vantagem, como você pode colocar em um cabeçalho de arquivo personalizado e criar um "Nome da coluna" como a primeira linha, o que torna o arquivo simples mais consumível por humanos.
Não se esqueça de salvá-lo, se você o criou uma vez, provavelmente será solicitado novamente! Espero que isto ajude..
fonte
Eu acho que o bcp.exe na linha de comando deve ser o caminho mais rápido.
http://msdn.microsoft.com/en-us/library/ms162802.aspx
fonte