Eu tenho um banco de dados onde eu carrego arquivos em uma tabela intermediária; dessa tabela intermediária, eu tenho 1-2 associações para resolver algumas chaves estrangeiras e, em seguida, insiro essas linhas na tabela final (que possui uma partição por mês). Eu tenho cerca de 3,4 bilhões de linhas para três meses de dados.
Qual é a maneira mais rápida de obter essas linhas de teste para a mesa final? Tarefa de fluxo de dados do SSIS (que usa uma exibição como fonte e possui carregamento rápido ativo) ou um comando Inserir INTO SELECT ....? Tentei a tarefa de fluxo de dados e posso obter cerca de 1 bilhão de linhas em cerca de 5 horas (8 núcleos / 192 GB de RAM no servidor), o que me parece muito lento.
Respostas:
Uma abordagem comum:
INSERT dbo.[Target] WITH (TABLOCKX) SELECT ...
n
linhas, o que pode reduzir a tensão no log de transações e, é claro, significa que, se algum lote falhar, você só precisará iniciar a partir desse lote. Eu publiquei um blog sobre isso (enquanto em referência a exclusões, os mesmos conceitos básicos se aplicam) aqui: http://www.sqlperformance.com/2013/03/io-subsystem/chunk-deletesSe suas partições são físicas e não apenas lógicas, você pode ganhar algum tempo fazendo com que processos diferentes preencham partições diferentes simultaneamente (é claro que isso significa que você não pode usar
TABLOCK
/TABLOCKX
). Isso pressupõe que a fonte também seja adequada para vários processos, selecionando sem sobreposição / bloqueio etc., e tornando esse lado da operação ainda mais lento (dica: crie um índice em cluster na fonte que se adapte ao esquema de particionamento no destino).Você também pode considerar algo muito mais primitivo, como
BCP OUT
/BCP IN
.Não sei se eu pularia para o SSIS para ajudar com isso. Provavelmente existem algumas eficiências por lá, mas não sei se o esforço justifica a economia.
fonte
Olhando para o seu problema da perspectiva do SSIS, sinto que a razão pela qual isso pode levar tanto tempo é que você não utilizou o lote. Isso pode levar a muitas linhas preenchendo o pipeline do SSIS e, consequentemente, prejudicar o desempenho do SSIS. O que você precisa fazer é alterar as configurações de linhas por lote e, possivelmente, o tamanho máximo de confirmação da inserção. Agora, o que você definiu também dependerá da quantidade de memória disponível para o servidor SSIS? Qual é a velocidade do disco da sua instância do SQL Server? A melhor maneira de fazer isso é testar. Vamos, por exemplo, usar 10.000. Isso enviará um lote para o servidor 10.000 de cada vez, evitando que o pipeline seja sobrecarregado e ajudará a executar esse processo mais rapidamente. Essas configurações são definidas no seu destino OLEDB.
Se for um problema, você também poderá adicionar uma tarefa de execução SQL antes e depois, conforme o @AaronBertrand sugere e remover / re adicionar quaisquer índices ou restrições à tabela.
fonte