Executei o programa de cópia em massa BCP do SQL Server 2005 assim:
bcp mydb.dbo.mytbl in myfile.blk -c -S mysvr -U mylogin -P mypass
E executou e produziu a saída da seguinte forma:
Starting copy...
1000 rows sent to SQL Server. Total sent: 1000
...
1000 rows sent to SQL Server. Total sent: 55000
Mas então parou. O cursor não voltou ao prompt, não recebi o "... linhas copiadas." mensagem.
Tentei consultar a tabela de destino e já consigo ver as linhas que queria importar.
Devo encerrar o console? Será que vai reverter?
Após 3 horas, finalmente recebi meu prompt de volta:
Embora eu ainda não saiba por que não retornou imediatamente, pois as linhas já foram inseridas. Meu melhor palpite é que ele fez a reconstrução do índice.
Vou tentar encerrar o console na próxima vez que ele desligar assim.
O processo parece travar porque, embora tenha enviado todos os dados para o SQL Server, os dados foram colocados apenas em buffers de classificação - ainda não chegaram à tabela de destino.
Quando a tabela tiver índices, o SQL Server classificará os dados na ordem de índice necessária antes de inseri-los. Se o conjunto de dados for grande, houver muitos índices ou o SQL Server tiver memória de classificação insuficiente disponível, esse processo poderá levar um tempo significativo. A presença de índices e dados de tabelas existentes também pode afetar a capacidade do SQL Server de usar inserções otimizadas minimamente registradas.
Sem inserções minimamente registradas, o processo de inserção (após a classificação) também será lento porque cada linha é totalmente registrada no log de transações (incluindo as informações necessárias para desfazer a inserção para garantir a capacidade de recuperação).
Várias opções bcp podem ser especificadas para ajudar a obter inserções minimamente registradas. Outras medidas também podem ser necessárias, como alterar temporariamente o modelo de recuperação do banco de dados para suportar operações em massa eficientes. Descartar índices não clusterizados antes da inserção e reconstruí-los depois também costuma ser a estratégia ideal.
Para resumir os pontos principais de um tópico complexo:
TABLOCK
dica (a sintaxe exata varia dependendo do método de inserção)ORDER
dica e certifique-se de que a fonte de dados seja pré-classificada pela chave de agrupamentoPara mais informações, veja:
Otimizando o desempenho de inserção em massa e páginas vinculadas
Para SQL Server 2008 e posterior:
O Guia de Desempenho de Carregamento de Dados