Estou tentando importar um script SQL longo (3,5 milhões de linhas, 1,5 GB de tamanho) contendo principalmente instruções INSERT INTO curtas com dados usando sqlcmd -E -d <database> -S 127.0.0.1 -i <scriptfile>
e está quase parando (aproximadamente 150 linhas por segundo) sem inferir qualquer perceptível carga no host do servidor SQL (todos os núcleos da CPU estão quase ociosos, a taxa de transferência do disco é de cerca de 200 KB/s).
Como o arquivo de origem está localizado em um compartilhamento NFS, primeiro suspeitei que esse fosse o culpado, mas um script idêntico disponível localmente é executado na mesma velocidade.
O banco de dados está basicamente vazio, as tabelas são criadas pelo mesmo script, sem gatilhos ou outras fantasias - apenas os dados brutos, principalmente numéricos ou varchar.
O que o SQLCMD está esperando? Existe alguma maneira de agilizar?
Editar:
estamos limitados em nossos meios para alterar os dados nos arquivos de script SQL. Os dados são fornecidos por um terceiro para um procedimento de importação. Acredito que foi exportado originalmente usando o recurso "Tabela de script como..." do Management Studio 2005.
Editar o arquivo é tedioso devido ao tamanho - qualquer operação leva uma eternidade com editores de texto comuns, embora o prefixo "SET NOCOUNT ON" tenha sido feito copiando dois arquivos juntos - e trouxe uma aceleração de aproximadamente 50%.
Devido à codificação de texto (Unicode-LE), é impossível editar com o conjunto comum de textutils GNU (que de outra forma funcionaria bem com arquivos grandes) sem converter - e estou relutante em converter devido a problemas de fidelidade de dados que provavelmente venha com ele.
Portanto, estou um pouco preso em como aplicar as sugestões sobre como inserir os blocos BEGIN TRAN/COMMIT TRAN ou converter as inserções individuais em conjuntos maiores.
Algumas ideias:
GO
comandos a cada mil ou alguns milhares de linhas. Então, em vez de um lote gigantesco, ele é dividido em vários lotes.Altere suasINSERT
declarações individuais paraINSERT ... VALUES ()
mil conjuntos cada.GO
). Seu relógio e o registro agradecerão.SET NOCOUNT ON
- caso contrário, a interface do usuário, o SQL Server e a rede entre eles gastam muito tempo enviando1 row(s) affected
mensagens para frente e para trás para cada inserção.