2008-10-23 6 views
1

Notre application exécute une longue procédure stockée avec plusieurs ensembles de résultats. Les utilisateurs éprouvent de longs temps d'attente pour cette requête, donc j'ai entrepris de déterminer ce qui cause le retard.SQL - L'appel de "reader.NextResult" provoque un long délai

Je mets un chronomètre sur l'exécution et la lecture des données, et cela prend 6-7 secondes à chaque fois. J'ai chronométré l'exécution de la procédure stockée, en espérant que cela prendrait tout le temps. Ce n'était pas - cela a pris 30ms ou plus.

J'ai donc mis des minuteurs autour de chacun des ~ 20 jeux de résultats. Chaque "bloc" a pris très peu de temps (< 10ms) à l'exception d'un dans le milieu du traitement, qui a pris 5-6 secondes. Après d'autres recherches, j'ai découvert que c'était l'appel "reader.NextResult()" qui prenait tout le temps. Ce long délai arrive au même endroit à chaque fois.

Si je viens exec la procédure stockée, il semble fonctionner réelle Snappy, il ne semble pas être un problème avec la requête - mais je ne sais pas ...

Comment interpréter ce? SQL expédie-t-il les ensembles de résultats au fur et à mesure qu'il les obtient, et l'ensemble de résultats en question est-il susceptible d'être un problème dans ma requête SQL? Ou est-ce que quelque chose d'autre peut causer le retard?

EDIT:

Merci pour la réponse et les commentaires - j'utilise SQL Server et .NET

Ce que j'étais plus curieux de savoir est pourquoi mon retard se produit sur la « NextResult() » appel. Étant nouveau dans le développement SQL, j'ai supposé qu'un délai dû à une exécution de procédure stockée longue apparaîtrait dans mon application en attendant que l'appel "ExecuteReader()" soit renvoyé. Il semble maintenant que SQL commencera à retourner les données AVANT que la requête soit terminée, et s'il y a un délai, il retardera l'appel NextResult().

J'ai commencé en pensant que mon retard était dans la procédure stockée. Lorsque l'appel de ExecuteReader() est revenu rapidement, j'ai pensé que mon retard était dans la gestion du lecteur par mon code. Lorsque le délai a fini par être sur l'appel NextResult(), j'étais confus. Je suis maintenant de retour à l'examen de la procédure stockée.

Merci à ceux d'entre vous qui ont pris le temps d'examiner mon problème et vous ont offert votre aide.

+0

quelle langue/plateforme utilisez-vous? pouvez-vous fournir un exemple de code source pour illustrer ce problème? –

+0

@ ScottB, vous supposez que la plate-forme rdbms n'est pas importante pour cette question et c'est une fausse hypothèse. Il est également important de savoir exactement quelles instructions SQL sont en cours d'exécution. Détails, détails, détails. –

Répondre

1

La réponse dépend du SGBDR que vous utilisez.

Si le SQL Server et .NET puis de mon expérience:

  1. Vérifiez d'autres transactions ouvertes sur la même connexion qui est utilisée pour invoquer la procédure stockée. Ils peuvent avoir des verrous de ligne sur la table que l'un de vos sélections exécute. Vous pouvez essayer d'ajouter "MultipleActiveResultSets = false" à votre chaîne de connexion SQL Server et voir si vous obtenez une amélioration, ou plus probablement une exception (et vous pouvez rechercher le problème à partir d'une exception). Cela peut également être un effet d'une connexion non réinitialisée renvoyée au pool de connexion (quelque chose que j'ai rencontré depuis que j'ai commencé à utiliser MARS).
  2. Vous devrez peut-être spécifier l'indicateur de table NOLOCK (ou READUNCOMMITTED, même chose) dans votre requête SELECT si dirty reads are acceptible.

    SELECT * FROM [tableau] AVEC NOLOCK

+0

S'il vous plaît ne pas recommander aucune serrure comme une sorte de balle d'argent –

+0

Compréhension à la lecture? "Mai ... les lectures sales sont acceptables." Utilisez-le pour résoudre le problème. – cfeduke

2

Lorsque vous exécutez une procédure stockée à partir d'une commande .Net, les résultats commencer à diffuser dès que SQL les a prêt.Cela signifie que vous pouvez commencer à voir des résultats dans votre application .Net avant que le processus stocké entier ait été exécuté.

Votre goulot d'étranglement est probablement dans la procédure stockée, exécutez une trace de serveur SQL et tracez toutes les instructions qui s'exécutent dans la procédure stockée (obtenir les durées). Vous serez en mesure de retrouver l'instruction exacte dans le processus qui est lent et vous serez également en mesure de prendre connaissance des paramètres qui sont passés à la proc afin que vous puissiez tester cela dans l'Analyseur de requêtes et regarder le plan. Un autre point qui manque à la question semble être la quantité de données que vous déplacez, bien que peu probable, il se peut que vous ayez de gros morceaux de données (comme des blobs) qui sont envoyés et le temps est écoulé être passé sur le fil. Vous avez vraiment besoin d'élargir la question un peu pour aider au diagnostic.

Questions connexes