Je sais qu'un INSERT sur une table SQL peut être lent pour plusieurs raisons:
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.
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 IO Statistiques pour voir combien IO les recherches FK prennent).
Quelle est l'attente causée par l'insertion (master.dbo.sysprocesses)?
Commençons ici et voyons où nous allons.
Brad,
Vous devez examiner les statistiques d'attente de votre requête. Avec SQL 2000, vous pouvez utiliser la syntaxe DBCC SQLPERF ("statistiques d'attente") pour obtenir ces détails.
Je peux dire ce que je recherche lors de l'analyse des performances d'une requête. Peut-être que ça aide.
Essayez d'utiliser:
SET STATISTICS IO ON
et
SET STATISTICS PROFILE ON
STATISTIQUES IO
Peut être utile pour vous dire quelles tables il effectue le plus d'analyses de table, de lectures logiques et de lectures physiques (j'utilise ces trois pour se concentrer sur la partie du plan de requête qui nécessite le plus de réglages)
PROFIL STATISTIQUE
Renvoie principalement le plan de requête dans un format tabulaire, vous pouvez ensuite consulter les colonnes IO et CPU pour ce qui coûte le plus cher dans la requête (est-ce l'analyse de la table sur votre table temporaire vs le type qu'il fait pour insérer dans votre clé en cluster, etc ...)