Je sais qu'un INSERT sur une table SQL peut être lent pour plusieurs raisons:
- Existence de INSERT TRIGGER sur la table
- Beaucoup de contraintes imposées qui doivent être vérifiées (généralement des clés étrangères)
- La page se divise dans l'index cluster lorsqu'une ligne est insérée au milieu du tableau
- Mise à jour de tous les index non cluster liés
- Blocage d'une autre activité sur la table
- Mauvais temps de réponse en écriture IO
- ... quelque chose que j'ai manqué?
Comment savoir qui est responsable dans mon cas spécifique? Comment puis-je mesurer l'impact des fractionnements de page par rapport aux mises à jour d'index non clusterisées par rapport à tout le reste?
J'ai un proc stocké qui insère environ 10 000 lignes à la fois (à partir d'une table temporaire), ce qui prend environ 90 secondes par 10 000 lignes. C'est trop lent, car cela provoque la temporisation d'autres spids.
J'ai examiné le plan d'exécution et je vois la tâche INSERT CLUSTERED INDEX et toutes les INDEX SEEKS des recherches FK, mais cela ne me dit toujours pas avec certitude pourquoi cela prend si longtemps. Pas de déclencheurs, mais la table a une poignée de FKeys (qui semblent être correctement indexés).
Il s'agit d'une base de données SQL 2000.
Réponses:
Certaines choses que vous pouvez regarder ...
Réduisez la taille du lot de 10000 à quelque chose de plus petit, comme 2000 ou 1000 (vous n'avez pas dit la taille de votre ligne).
Essayez d'activer les statistiques d'E / S pour voir combien d'E / S les recherches FK nécessitent.
Quelle est l'attente causée par l'insertion (master.dbo.sysprocesses)?
Commençons ici et voyons où nous allons.
la source
Brad,
Vous devez examiner les statistiques d'attente de votre requête. Avec SQL2000, vous pouvez utiliser la syntaxe DBCC SQLPERF ("waitstats") pour obtenir ces détails.
la source
Je peux dire ce que je recherche lors de l'analyse des performances d'une requête. Peut-être que ça aide.
la source
Essayez d'utiliser:
et
STATISTIQUES IO
PROFIL STATISTIQUE
la source