Qual é a maneira mais rápida de exportar uma tabela para um arquivo de texto

17

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 intou 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.

softveda
fonte
3
"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?
precisa

Respostas:

10

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 :-).

Marian
fonte
4

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

Pedaços de bacon
fonte
Nada mal, na verdade, isso salva um pacote SSIS no final. Se for uma tarefa única, pode ser uma solução.
Marian
2

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

Brian
fonte
Essa questão em particular não é muito detalhada. Eu sugiro que você leia a seguinte pergunta - Otimizando o desempenho do BCP para dados BLOB aqui. Certamente dará uma idéia das muitas opções de jogo que você tem apenas com o BCP :-).
Marian
Eu vejo os links e concordo plenamente. Mas a maioria dos pontos de otimização é para carregar dados no servidor sql. Ainda não vi nenhum fato relacionado ao bcp ser mais rápido que uma solução CLR de streamwriter ou filestream ao gravar dados sql em um arquivo simples.
Brian
1

Você pode criar um pacote simples do SSIS:

Aqui está um alto nível de como:

  1. Crie uma conexão OLEDB com o banco de dados no gerenciador de conexões
  2. Arraste uma Transformação de fluxo de dados para o Controle de fluxo e clique nela para acessar o fluxo de dados.
  3. Arraste uma fonte OLEDB da caixa de ferramentas para o fluxo de dados e edite-a para que ela se conecte à sua tabela desejada usando a conexão que você criou na etapa 1
  4. Arraste um Destino de arquivo simples da caixa de ferramentas para o fluxo de dados e conecte a fonte OLEDB a ele.
  5. Selecione "Novo" no Destino do arquivo simples, e ele criará um novo arquivo simples com a mesma estrutura de coluna e você poderá usar o delimitador desejado ou talvez um arquivo fixo, se desejar.
  6. Executá-lo.

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..

Chef Slagle
fonte
0

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

bummi
fonte
5
Embora você esteja certo, poderia esclarecer alguns detalhes sobre esta solução? Como ele é usado (um link para a documentação pode ser suficiente), por que você acha que é o mais rápido etc.
Dezso