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 clusterizados relacionados
- Bloqueio de outras atividades na mesa
- Tempo de resposta de gravação de E/S ruim
- ... 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 em relação às atualizações de índice não clusterizadas em relação a todo o resto?
Eu tenho um proc armazenado que insere cerca de 10.000 linhas por vez (de uma tabela temporária), o que leva cerca de 90 segundos por 10 mil linhas. Isso é inaceitavelmente lento, pois faz com que outros spids expirem.
Examinei o plano de execução e vejo a tarefa INSERT CLUSTERED INDEX e todas as INDEX SEEKS das pesquisas FK, mas ainda não me diz com certeza por que demora tanto. Nenhum gatilho, mas a tabela tem um punhado de FKeys (que parecem estar indexadas corretamente).
Este é um banco de dados SQL 2000.
Algumas coisas que você pode ver...
Reduza o tamanho do lote de 10.000 para algo menor, como 2.000 ou 1.000 (você não disse o tamanho da linha).
Tente ativar o IO Stats para ver a quantidade de IO que as pesquisas FK estão recebendo.
Qual é a espera causada quando a inserção está acontecendo (master.dbo.sysprocesses)?
Vamos começar aqui e ver para onde vamos.
Brad,
Você deve examinar as estatísticas de espera para sua consulta. Com o SQL2000, você pode usar a sintaxe DBCC SQLPERF("waitstats") para obter esses detalhes.
Posso dizer o que estou procurando ao analisar o desempenho de uma consulta. Talvez ajude.
Tente usar:
e
ESTATÍSTICAS IO
PERFIL DE ESTATÍSTICAS
Sugestões: