|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 77 ![]() |
Bonjour
Aujourd'hui lors d'un process en production, j'ai rencontre un probleme que nous n'avions jamais eu auparavant. Un web service est appele pour metter a jour certaines donnees dans une bdd. voila un pseudo code: Code :
Et donc voila le probleme, l'execution de sp2 (qui n'est rien d'autre qu'un simple update en SQL) a commence a renvoyer l'exception suivante: Citation:
Apres avoir modifie le code vite fait pour "sauter" cette ligne, tout le reste de la table a ete mise a jour avec succes. Ma question est la suivante: Y'a-t-il quoique ce soit d'autre qu'un lock sur cette ligne qui pourrait causer ce probleme ? Merci Edit Je precise un peu les environnements : - SQL server 2008 - IIS 7 - Web service asp.net "classique" (pas WCF quoi) - ADO.NET pour tout ce qui est connection/execution des commandes SQL - .NET 4 pour le runtime c'est a peu pres tout je crois Ce message a peut-etre davantage sa place sur le forum SQL-server je ne sais pas... |
|||
|
|
00
|
|
|
#2 |
|
Nouveau Membre du Club
![]() Inscription : juillet 2006 Messages : 63 ![]() |
il nous faudra le code SQL de mise à jour . Je pense que le plantage est là .
regarde par la meme occasion s'il y a des trigger sur la table |
|
|
00
|
|
|
#3 |
|
Expert Confirmé Sénior
![]() François Chef de projet NTIC Inscription : janvier 2007 Messages : 5 357 ![]() |
Bonjour
Tu peux toujours augmenter le CommandTimeOut dans l'objet commande. Sinon, un truc m'interpelle quand même à la lecture de ton pseudo-code : pourquoi as tu un code qui apelle une prco stoc et en fonction du retour rapelle une autre proc stoc sur les données retournées ? il y a une raison précise pour que l'ensemble du traitement ne soit pas confié au SGBD et fasse des allez-retour de données vers le web service ? En dehors de cela, la question relève plus de Sql Server que de C#. Vous avez utilisé le Profiler pour voir les requêtes au sein des PS qui prennent du temps ?
__________________
Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça... Une réponse vous a aidé ? utiliser le bouton "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel |
|
|
00
|
|
|
#4 | |||
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 77 ![]() |
Citation:
Code :
![]() enfin bref, c'est donc un update ultra con. Je reprecise ce qui s'est passe: - cette procedure n'a a ma connaissance jamais plante auparavant. - hier elle m'a sorti un timeout 15 fois d'affille sur la meme ligne (time out etait de 30 sec par defaut, pousse a 4 min, meme constat, j'ai le sentiment que j'aurais pu mettre 1h ca aurait ete pareil) - Un restart du server SQL n'a pas resolu le probleme - pas de trigger sur la table, ni d'index, et le champ ID n'est meme pas defini comme cle primaire (oui nous avons egalement herite de bases de donnees en ruine) voila tout ca reunis je me dis que ca ne peut venir que d'un lock qui se serait glisse je ne sais encore comment, mais j'aimerais elimine toute autre possibilite. Qu'en pensez-vous? cela peut-il venir d'autre chose que d'un rowlock ? et au passage, un restart du server SQL n'est pas sense retirer tous les locks existants ? Merci |
|||
|
|
00
|
|
|
#5 | |
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 77 ![]() |
Citation:
Oui pour profiler et la requete qui plante coute cacahuete en resource comme le code peut le laisser penser. |
|
|
|
00
|
|
|
#6 | |
![]() ![]() |
Citation:
__________________
Email : http://scr.im/waldar |
|
|
00
|
|
|
#7 | ||
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 77 ![]() |
bonjour
la table contient 39000 lignes environ. voila le code de la table en question: Code :
|
||
|
|
00
|
|
|
#8 |
![]() ![]() |
Rajoutez une clef primaire sur la colonne ID, vous devriez noter une très nette amélioration !
__________________
Email : http://scr.im/waldar |
|
10
|
|
|
#9 | |
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 77 ![]() |
Citation:
Toutefois je cherche encore a comprendre ce qui a pu provoquer ce fameux timeout (de maniere consistante sur la meme ligne de la table). J'ai vais essayer de mettre un lock sur une ligne dans notre env de test et de voir si je peux reproduire le meme message comme ca. Toute piste est la bienvenue. |
|
|
|
00
|
|
|
#10 |
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 77 ![]() |
Bon je n'ai as l'explication mais d'apres diverses recherches, un probleme lie a un rowlock m'aurait renvoyer une erreur differente et MSDN ne mentionne pas le lock comme possible cause de l'erreur TimeOut expired.
Je vais mettre une cle primaire et un index, et prier. Merci |
|
|
00
|
|
|
#11 | |
|
Expert Confirmé Sénior
![]() François Chef de projet NTIC Inscription : janvier 2007 Messages : 5 357 ![]() |
Citation:
Code :
SET TRANSACTION ISOLATION-LEVEL READ UNCOMMITTED Contrairement à ce que tu dis, un timeout sur un rowlock est tout à fait habituel.
__________________
Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça... Une réponse vous a aidé ? utiliser le bouton "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel |
|
|
|
00
|
|
|
#12 |
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 77 ![]() |
Desole de faire remonter ce vieux sujet mais je n'avais jamais trouve le fin mot de l'histoire.
Hier le probleme s'est produit de nouveau, sur la meme table mais une ligne et une requete differente. On a pu observe les points suivants: - la requete (un bete select avec une jointure basique) retourne un timeout apres 90 sec (uniquement lorsqu'appelle depuis le code C# - la meme requete (exactement la meme), executee depuis SQL studio retourne le resultat en 0:00 sec - cette requete n'a jamais eu de probleme de performance auparavant. Ce n'est pas comme si elle etait passe de 85 sec pour s'executer a 90 sec, c'est passe de rien a time out du jour au lendemain. La mise en place d'un index a resolu le probleme instantanement. Alors je sais que les voies de SQL sont impenetrables et qu'un tas de trucs bizarre peuvent arriver, mais pour qu'une requete donne un timeout apres 1min30 dans un cas et renvoit le resultat instantanement dans l'autre, faut m'expliquer... Ma theorie c'est que les query dans SQL Studio sont optimisees d'une maniere ou d'une autre, que les appels depuis ADO.NET ne le sont pas... |
|
|
01
|
|
|
#13 |
![]() ![]() |
Je n'avais pas fait attention à la première lecture mais vous avez un problème avec le typages de vos données.
Dans votre table : ID int Payee_Account_Location varchar(50) Payee_Account_Number varchar(50) @Diary_ID varchar(20) @Payee_Account_Location varchar(10) @Payee_Account_Number varchar(10) Pour les chaînes de caractères plus courtes c'est moins grave, un varchar(10) rentrera toujours dans un varchar(50), mais autant faire propre. Quant à l'exécution de votre select, y a-t-il des variables concernées ? Si vous pouvez reproduire le problème a volo, je vous conseille de lancer une trace avec le profiler afin de vérifier que la requête que vous pensez être la même soit réellement la même.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#14 |
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 77 ![]() |
Merci Waldar
Effectivement, cette erreur ne doit pas aider la bdd a fonctionner correctement... Lorsque le probleme est reapparu la semaine derniere, c'etait sur une autre procedure stockee, qui n'a pas de parametre ID. Nous avions utilise le profiler et la requete executee depuis le studio etait un copier coller de celle que le profiler loggait et affichait comme prenant 90 sec avec un timeout, donc c'est vraiment exactement le meme code qui fonctionne depuis le studio et pas depuis .NET. Je pense toujours que le Studio possede un petit niveau d'optimisation ou qqch comme ca qui expliquerait ce comportement. |
|
|
00
|
|
|
#15 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Effectivement oui, c'est souvent un problème de parameter sniffing. Lire l'article de mon confrère au nom imprononçable :
http://blog.developpez.com/sqlpro/p9...s-de-requetes/ A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#16 |
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 77 ![]() |
Merci pour ce super article, cette fois ci le post est resolu.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com