Tenho um banco de dados no modelo de recuperação SIMPLES com 10GB livres.
O arquivo que estou tentando carregar por meio do carregamento em massa do SSIS é de 1 GB.
A tabela está vazia (truncada antes de cada carregamento), é um heap e não possui índices não clusterizados. É uma tabela de campos varchar(255).
Ao executar a tarefa de inserção em massa, posso observar o tamanho do banco de dados crescer de 2 GB para 12 GB (espaço máximo disponível), onde fica sem espaço e retorna a seguinte mensagem:
Erro [Bulk Insert Task]: Ocorreu um erro com a seguinte mensagem de erro: "Não foi possível alocar espaço para o objeto 'dbo.tablename' no banco de dados 'DBNAME' porque o grupo de arquivos 'PRIMARY' está cheio. Crie espaço em disco excluindo arquivos desnecessários, soltando objetos no grupo de arquivos, adicionando arquivos adicionais ao grupo de arquivos ou definindo o crescimento automático para arquivos existentes no grupo de arquivos.".
Em primeiro lugar, pensei porque estava no modelo de recuperação SIMPLES, o carregamento em massa não é registrado. Eu sei que é quando há dados na tabela E um índice clusterizado, mas nenhum dos dois é o caso aqui. Presumo que a Tarefa de Inserção em Massa esteja incluída nisso, pois deve usar o BCP. Estou errado?
Em segundo lugar, parece estranho que um arquivo de texto de 1 GB resulte em 10 GB nos campos varchar do SQL Server. Isso parece muito estranho. Os dados não estão sendo transformados, estão sendo carregados em massa em uma tabela. Por que está crescendo tanto?
O problema é que você está simplesmente ficando sem espaço em disco e o arquivo físico não pode crescer para concluir a transação, ou você tem um limite nas configurações de crescimento do arquivo SQL e o arquivo físico não pode crescer mais para concluir a transação (seja qual for o espaço máximo disponível significa exatamente, por exemplo, por configurações ou capacidade de disco).
De acordo com o site abaixo e o texto citado, ele afirma que o registro mínimo é mais eficiente do que o registro completo, mas NÃO afirma que NENHUM registro ocorre no
SIMPLE
modo de recuperação.Portanto, isso significa que ainda há log de transações SQL que ocorre quando o banco de dados está no
SIMPLE
modo de recuperação, mas é um log mínimo quando comparado aoFULL
modo de recuperação.Parece que a explicação seria que seus tamanhos de transação comprometidos com as
BULK INSERT
operações são ENORMES. Simplesmente faça os parâmetros de tamanho de commit\batch de sua lógica no SSIS ou execute o TSQL no pacote de tamanho menor. Tente testar com 100, 1000, 10000, 100000 e assim por diante para ver o que oferece o melhor resultado e evita que o problema ocorra.Se as transações forem menores, depois que as transações confirmadas forem confirmadas no
SIMPLE
modo de recuperação, o espaço de log das transações confirmadas poderá ser reutilizado por transações subsequentesBULK INSERT
(ou outras).Recursos adicionais
(Estes artigos parecem ter algumas referências a parâmetros potenciais em áreas de pacote SSIS para definir para transações menores, etc. Os títulos ou as etapas podem ser para um objetivo final diferente, mas há conteúdo potencialmente aplicável neles para o que você pode precisar alteração em sua lógica SSIS para corrigir seu problema, portanto, pode valer a pena uma simples leitura.)