Quais são as armadilhas de inserção de milhões de registros em SQL Server a partir de arquivo simples?

StackOverflow https://stackoverflow.com/questions/141556

Pergunta

Estou prestes a começar uma jornada escrevendo um aplicativo Windows Forms que irá abrir um arquivo txt que é tubo delimitado e cerca de 230 MB de tamanho. Este aplicativo irá, em seguida, inserir esses dados em um banco de dados SQL Server 2005 (Obviamente, isso precisa acontecer rapidamente). Eu estou usando c # 3.0 e .NET 3.5 para este projeto.

Eu não estou pedindo para o aplicativo, basta alguns conselhos comunais aqui e armadilhas potenciais aconselhar. A partir do site eu ajuntar que cópia em massa SQL é um pré-requisito, há algo que eu deveria pensar em (I pense que só abrir o arquivo txt com um aplicativo de formulários será um grande esforço, talvez quebrá-lo em dados blob?) <. / p>

Obrigado, e eu vou editar a pergunta para maior clareza, se alguém precisa dele.

Foi útil?

Solução

Você tem que escrever um aplicativo winforms? Pode ser muito mais fácil e rápido de usar SSIS. Há alguns built-in tarefas disponíveis, especialmente inserção em massa tarefa .

Além disso, vale a pena conferir Flat File importação em massa comparação métodos velocidade em SQL Server 2005.

Update: Se você é novo para SSIS, confira alguns desses sites para chegar na via rápida. 1) SSIS Flow Control Basics 2) Introdução ao SQL Server Integration Services

Esta é uma outra Como: em importar o arquivo do Excel no SQL 2005 .

Outras dicas

Este vai ser um esforço de streaming.

Se você puder, não use transações aqui. O custo transacional será simplesmente muito grande.

Então, o que você vai fazer é ler o arquivo de uma linha de cada vez e inseri-lo em uma linha de cada vez. Você deve despejar falhou inserções em outro arquivo que você pode diagnosticar mais tarde e ver onde eles falharam.

No começo eu iria em frente e tentar uma inserção em massa de um par de centenas de linhas apenas para ver que o streaming está funcionando corretamente e, em seguida, você pode abrir tudo o que quiser.

Você pode tentar usar SqlBulkCopy . Ele permite que você puxa a partir de "qualquer fonte de dados".

Assim como uma nota lateral, às vezes é mais rápido para soltar os índices de sua tabela e recriá-las depois de a maior inserção operação.

Você pode considerar a mudança de plena recuperação para bulk-registrado. Isso ajudará a manter seus backups de um tamanho razoável.

Eu recomendo totalmente SSIS, você pode ler em milhões de registros e limpá-los ao longo do caminho em relativamente pouco tempo.

Você precisará reservar algum tempo para se familiarizar com SSIS, mas deve pagar. Existem alguns outros tópicos aqui no SO que provavelmente serão úteis:

Qual é a maneira mais rápida de massa inserir um monte de dados em SQL Server (C # cliente)

Quais são o material de aprendizagem recomendado para SSIS?

Você também pode criar um pacote de C #. Eu tenho um programa C # que lê um "arquivo mestre" 3GL a partir de um sistema legado (parses em um modelo de objeto usando uma API que eu tenho para um projeto relacionado), leva um modelo de pacote e modifica-lo para gerar um pacote para o ETL.

O tamanho dos dados que você está falando, na verdade, não é tão gigantesca. Eu não sei o que suas preocupações de eficiência são, mas se você pode esperar algumas horas para que possa inserir, você pode ser surpreendido com o quão fácil isso seria realizar com uma técnica muito ingênuo de apenas inserindo cada linha um de cada vez . De lotes junto a mil ou mais linhas de cada vez e submetê-los ao servidor SQL pode torná-lo um pouco mais rápido também.

Apenas uma sugestão que poderia poupar algum tempo de programação séria, se você não precisa dele para ser tão rápido como concebível. Dependendo da forma como esta importação tem que correr, poupando alguns dias de tempo de programação poderia facilmente valer a pena em troca de esperar algumas horas enquanto ele é executado.

Você pode usar o SSIS para a leitura e inserção, mas chamá-lo como um pacote de seu WinForms aplicativo. Então você poderia passar em coisas como origem, destino, seqüências de conexão etc como parâmetro / configurações.

HowTo: http://msdn.microsoft.com/en-us /library/aa337077.aspx

Você pode configurar transforma e tratamento de erros dentro SSIS e até mesmo criar ramificação lógica baseada em parâmetros de entrada.

Se o formato de coluna do arquivo corresponde a tabela de destino onde as necessidades de dados para acabar, eu prefiro usar o utilitário de linha de comando bcp para carregar o arquivo de dados. É incrivelmente rápido e você pode especificar e arquivo de erro para todos os registros "impares" que deixam de ser inserido.

Seu aplicativo poderia lançar o comando se você precisa armazenar os parâmetros de linha de comando para ele (servidor, banco de dados, nome de usuário / senha ou conexão confiável, mesa, arquivo de erro etc.).

Eu gosto deste método melhor do que correr um volume comando INSERT SQL porque o arquivo de dados não é necessário para ser em um sistema acessível pelo servidor de banco de dados. Para usar a granel inserção você tem que especificar o caminho para o arquivo de dados de carga, por isso deve ser um caminho visível e legível pelo usuário do sistema no servidor de banco de dados que está executando a carga. Ter muito trabalho para mim normalmente. : -)

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