2011-07-07 3 views
2

J'ai exécuté des tests de vitesse sur une requête où j'insère 10 000 enregistrements dans une table contenant des millions (plus de 24 mil) d'enregistrements. La requête (ci-dessous) n'introduira pas d'enregistrements en double.Temps d'exécution sporadique pour la requête dans SQL Server 2008

MERGE INTO [dbo].[tbl1] AS tbl 
USING (SELECT col2,col3, max(col4) col4, max(col5) col5, max(col6) col6 FROM #tmp group by col2, col3) AS src 
ON (tbl.col2 = src.col2 AND tbl.col3 = src.col3) 
WHEN NOT MATCHED THEN 
INSERT (col2,col3,col4,col5,col6) 
VALUES (src.col2,src.col3,src.col4,src.col5,src.col6); 

Les temps d'exécution de la requête ci-dessus sont sporadiques; allant de 0:02 secondes à 2:00 minutes. J'exécute ces tests dans SQL Server Studio via un script qui créera les 10 000 lignes de données (dans la table #tmp), puis la requête MERGE ci-dessus est déclenchée. Le point étant, le même script exact s'exécute pour chaque test que je cours.

Le temps d'exécution rebondissent autour de secondes à quelques minutes, comme dans:

  • Test n ° 1: 0:10 secondes
  • Test n ° 2: 1:13 minutes
  • Essai n ° 3: 0: 02 secondes
  • test n ° 4: 1:56 minutes
  • test n ° 5: 0:05 secondes
  • test n ° 6: 1:22 minutes

Une métrique que je trouve intéressante est que la séquence alternée de secondes/minutes est relativement cohérente - c'est-à-dire que tous les autres tests les résultats sont en secondes.

Pouvez-vous me donner des indices quant à ce qui pourrait causer des temps d'exécution si sporadiques?

+0

Avez-vous éliminé d'autres possibilités: la latence du réseau, DB est parfois très occupé à répondre à d'autres demandes, etc.? –

+0

Cela semble étrangement familier w/[ma question] (http://stackoverflow.com/questions/4600883/sql-2005-connection-using-classic-ado-from-windows-2008-yields-odd-performance). Je serai intéressé de voir si vous comprenez ce qui se passe. –

+0

@Jeff - Le DB réside sur la même machine que SQL Studio, donc il ne devrait pas y avoir de souci pour la latence du réseau, non? En ce qui concerne l'élimination d'autres possibilités, je ne sais même pas par où commencer. – Jed

Répondre

1

Je voudrais pouvoir dire ce que la cause des temps d'exécution sporadiques était, mais je peux dire ce que je faisais pour contourner le problème ...

J'ai créé une nouvelle table de base de données et cible et ajouté 25 millions enregistre dans la table cible. Ensuite, j'ai exécuté mes tests d'origine sur la nouvelle base de données/table en insérant de manière répétée des enregistrements 10k dans la table cible. Les résultats étaient des temps d'exécution cohérents d'environ 0:07 secondes (pour chaque insertion de 10k).

Pour les coups de pied, j'ai fait exactement les mêmes tests sur une machine qui a deux fois plus de CPU/mémoire que mon ordinateur portable dev. Les résultats ont été des temps d'exécution cohérents de 0:00 secondes (Il est temps pour une nouvelle machine dev;))

Je n'aime pas découvrir la cause du problème, mais dans ce cas, je vais devoir l'appeler bon et avance. Heureusement, un jour, un StackO die-hard peut mettre à jour cette question avec une bonne réponse.

+1

basé sur votre résolution c'était soit de mauvaises statistiques ou de la fragmentation. – JNK

Questions connexes