INSERT leva mais de 5 horas, ao inserir mais do que um número específico de linhas

8

Ao inserir menos de 1.350.000 linhas na tabela, isso leva cerca de 2 minutos; no entanto, quando o número de linhas inseridas é maior, o tempo necessário para inserir dados cresce para cerca de 5 horas.

O problema não está relacionado à consulta ou índices, porque tudo está funcionando bem há muito tempo e nada mudou na estrutura da consulta, tabelas ou índices.

O problema apareceu pela primeira vez há cerca de duas semanas e aparece repetidamente em dias, quando o número de linhas inseridas é maior que + -1.350.000. Por exemplo, em um dia, o número de linhas inseridas é de 1.200.000 e o processo leva 2 minutos; no outro dia, o número de linhas é de 1.450.000 e leva de 5 a 6 horas para inserir dados.

Tentei reconstruir índices, mas não ajudou.

Piotr
fonte
3
Qual é a fonte da inserção?
Martin Smith
4
Você pode postar qual é a espera associada quando a inserção está demorando tanto?
Kin Shah
4
Só podemos adivinhar, a menos que você forneça mais informações. Meu palpite é que a escalada de bloqueio está acontecendo. Você pode rastrear espera e escalonamento de bloqueio
shanky
11
É a primeira vez que você tenta inserir 1,3 milhão de registros? Você está fazendo transações? Importação em massa? Que tipo de registro você está fazendo? Se você estiver inserindo plain-jane, concordo, tente fazer as inserções em lotes.
SQLburn 8/09/14
2
Como você importa os dados (bcp, inserção em massa, SSIS, arquivo em lotes)? De onde (armazenamento local, unidade igual / diferente, armazenamento em rede, ..)? Qual é o esquema da tabela? Qual é o comando de importação? Qual é o plano de execução (se for simples T-SQL)?
Marian

Respostas:

14

Meu palpite seria - se você não está realmente sendo bloqueado - que você está atingindo um limite acima do qual o arquivo de dados (e / ou arquivo de log) deve crescer e que sua configuração não está otimizada para suportar esse crescimento. Garanta que:

  1. A taxa de crescimento do seu arquivo de dados é razoável e possui um tamanho fixo (não%!) Grande o suficiente para acomodar essa transação e qualquer outra coisa que possa estar ocorrendo simultaneamente.
  2. O mesmo para o arquivo de log.
  3. A inicialização instantânea do arquivo está ativada . Isso ajudará a acelerar o crescimento de arquivos de dados, mas não o crescimento de arquivos de log geralmente mais problemático.
  4. Você não está inserindo 1,35 milhão de linhas individuais em um loop ou de outra forma todas como uma grande transação. Há algo a ser dito para dividir suas transações em partes .
Aaron Bertrand
fonte
11
Aaron é pontual, com suas sugestões soa como crescimento de arquivos de dados ou arquivos de log. Verifique também se a contagem de arquivos de log virtual é baixa.
Namphibian 9/09/14
4

Isso pode ser um problema de memória?

Você pode ver esse tipo de comportamento se algum pedaço de dados que deve ser acessado repetidamente se tornar muito grande para a memória e você sofrer uma pancada no disco do inferno. Se você precisar fazer um loop em um pedaço de dados grande demais para a memória, acabará lendo tudo novamente no arquivo de troca para cada passagem, empurrá-lo para além desse limite pode fazer com que seu desempenho caia de um precipício.

Loren Pechtel
fonte
3

Você está tentando / é possível dividi-los em lotes menores? Quando encontrei um problema semelhante, agrupá-los em 5.000 (com GO) reduziu muito o tempo necessário para concluir essa tarefa.

Alex Szabó
fonte