Eu sei que um INSERT em uma tabela SQL pode ser lento por vários motivos:
- Existência de INSERT TRIGGERs na mesa
- Muitas restrições impostas que precisam ser verificadas (geralmente chaves estrangeiras)
- A página é dividida no índice clusterizado quando uma linha é inserida no meio da tabela
- Atualizando todos os índices não agrupados relacionados
- Bloqueio de outras atividades na mesa
- Tempo de resposta de gravação de E / S insuficiente
- ... alguma coisa que eu perdi?
Como posso saber qual é o responsável no meu caso específico? Como posso medir o impacto das divisões de página versus atualizações de índice não agrupadas em cluster e tudo o mais?
Eu tenho um proc armazenado que insere cerca de 10.000 linhas por vez (de uma tabela temporária), que leva cerca de 90 segundos por 10 mil linhas. Isso é inaceitavelmente lento, pois faz com que outros spids se esgotem.
Examinei o plano de execução e vejo a tarefa INSERT CLUSTERED INDEX e todas as INDEX BUSCAS das pesquisas do FK, mas ainda não me diz ao certo por que leva tanto tempo. Não há gatilhos, mas a tabela possui um punhado de FKeys (que parecem estar adequadamente indexados).
Este é um banco de dados SQL 2000.
Respostas:
Algumas coisas que você pode olhar ...
Reduza o tamanho do lote de 10000 para algo menor, como 2000 ou 1000 (você não disse quão grande é o tamanho da sua linha).
Tente ativar as estatísticas de IO para ver quanto IO as pesquisas do FK estão levando.
Qual é a espera causada quando a inserção está acontecendo (master.dbo.sysprocesses)?
Vamos começar aqui e ver para onde vamos.
fonte
Brad,
Você deve examinar as estatísticas de espera da sua consulta. Com o SQL2000, você pode usar a sintaxe DBCC SQLPERF ("waitstats") para obter esses detalhes.
fonte
Posso dizer o que estou procurando ao analisar o desempenho de uma consulta. Talvez ajude.
fonte
Tente usar:
e
ESTATÍSTICAS IO
PERFIL ESTATÍSTICO
fonte